为什么它不能通过类找到元素?

2024-10-01 04:47:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在输入字段中键入一些内容,但是当我用类调用它时,它返回一个错误。网站有足够的时间加载所有元素,所以这不应该是问题所在

我的代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
browser = webdriver.Firefox()

browser.get('https://www.tradingview.com/chart/')
print("a")
time.sleep(5)
elem = browser.find_element_by_id("header-toolbar-symbol-search")  # Find the search box
print("b")
elem.click()
time.sleep(5)
crypto_search = browser.find_element_by_class_name("search-Hsmn_0WX upperCase-Hsmn_0WX input-3n5_2-hI")
print("c")
crypto_search.send_keys("VETUSD")
time.sleep(10)
browser.quit()

当我运行代码时,会出现以下错误:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: .search-Hsmn_0WX upperCase-Hsmn_0WX input-3n5_2-hI

它到达打印a和b的行,但在调用带有类的元素的行停止


Tags: 代码fromimportbrowser元素searchtimeselenium
3条回答

根据文档,您需要使用“查找元素”

这是因为类是在一个页面上有多个类时使用的,所以只选择一个具有类名的元素是没有意义的,即使页面上只有一个元素

如果该元素是页面上唯一具有该类的元素,请尝试使用

browser.find_elements_by_class_name("search-Hsmn_0WX upperCase-Hsmn_0WX input-3n5_2-hI")[0]

1摆脱time.sleep(),因为您的测试将变得不可靠和缓慢。使用隐式/显式等待

2如果一个类中有多个类,请使用cssxpath选择器

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys

browser = webdriver.Firefox()

browser.get('https://www.tradingview.com/chart/')
wait = WebDriverWait(browser, 10)
wait.until(EC.element_to_be_clickable((By.ID, "header-toolbar-symbol-search"))).click()  # Find the search box
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".search-Hsmn_0WX.upperCase-Hsmn_0WX.input-3n5_2-hI"))).send_keys("VETUSD")
#  browser.close()

在这里,我等待第一个元素是可点击的,第二个元素是可见的,这是Selenium中显式等待工作的一个示例

请注意,我的测试版本有多快

而不是

crypto_search = browser.find_element_by_class_name("search-Hsmn_0WX upperCase-Hsmn_0WX input-3n5_2-hI")

请尝试以下操作:

crypto_search = browser.find_element_by_css_selector(".search-Hsmn_0WX.upperCase-Hsmn_0WX.input-3n5_2-hI")

我试过了,结果成功了。
此外,由于这些类名是多个的,并且看起来不太具有描述性,因此我更喜欢以下选择器:

crypto_search = browser.find_element_by_css_selector("[data-name='symbol-search-items-dialog'] input")

相关问题 更多 >