【问题标题】:Why doesn't it find the element by the class?为什么它没有按类找到元素?
【发布时间】:2021-05-18 21:00:44
【问题描述】:

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

我的代码:

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 的行,但它停在调用带有类的元素的行。

【问题讨论】:

  • 如果它解决了您的问题,请接受答案。

标签: python selenium css-selectors


【解决方案1】:

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 中显式等待如何工作的示例。

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

【讨论】:

    【解决方案2】:

    代替

    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")
    
    

    【讨论】:

    • 第一个选择器看起来也不错。我添加了更多建议的答案。 time.sleep() 对 Selenium 来说是个坏主意。
    • @vitaliis 你对睡眠的看法是绝对正确的。我只是没有处理这一点,因为这不是导致错误的原因
    【解决方案3】:

    根据您需要使用“find_elements”的文档。

    这是因为当一个页面上有多个类时会使用类,因此即使页面上只有一个类名,只选择一个具有类名的元素也没有意义。

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

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

    【讨论】:

    • "这是因为当一个页面上有多个类时使用类" 这不是真的,一个类可以用来唯一标识一个元素。而且我对您编写的建议代码感到困惑...如果只有一个元素,您不应该使用find_element 而不是find_elements
    • @C.Peck 你完全正确! search-Hsmn_0WX upperCase-Hsmn_0WX input-3n5_2-hI 是一个唯一的定位器,那里没有更多包含这些类名的元素
    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    相关资源
    最近更新 更多