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 的行,但它停在调用带有类的元素的行。
解决方案
1 去掉 time.sleep() 因为你的测试会变得不可靠和缓慢。使用隐式/显式等待
2 如果您在一次使用css
或xpath
选择器中有多个类。
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 中如何工作的例子。
请注意,我的测试版本有多快。
推荐阅读
- python - 有没有办法在 matplotlib 条形图中拟合每个条形的 x 轴文本?
- r - 根据列值保留前几个重复项
- c# - 使用反射查找枚举器的方法
- python - 在 MatPlotLib 中并排绘制 2 个饼图
- visual-studio-app-center - Appcenter 是空的,当应用程序崩溃时没有收到错误
- python - 具有 tensorflow 功能的自定义 keras 指标。未初始化的变量
- amazon-web-services - 如何公开使用私有 IP?
- javascript - TypeError:无法再次读取未定义的属性“地图”
- android - Flutter - Flutter 中是否有类似同步适配器的东西
- java - java - 如何将返回的数组重新分配给java中的预先存在的数组