【问题标题】:find_element_by_class_name in selenium giving error硒中的find_element_by_class_name给出错误
【发布时间】:2021-04-11 05:43:32
【问题描述】:

我正在尝试使用 selenium 自动单击按钮,但它给了我错误。该页面的html代码为:

我正在尝试的代码是:

create_team=driver.find_element_by_class_name('ts-btn ts-btn-fluent ts-btn-fluent-secondary ts-btn-fluent-with-icon join-team-button')
create_team.click()

我收到以下错误:

【问题讨论】:

  • 是否有其他方法可以找到按钮
  • 你能试试上面提到的答案吗

标签: selenium selenium-webdriver


【解决方案1】:

driver.find_element_by_class_name() 只接受一个类名,它不是为处理多个类名而构建的,参考 - (How to locate an element with multiple class names?),这似乎有待讨论

使用driver.find_element_by_css_selector('ts-btn.ts-btn-fluent.ts-btn-fluent-secondary.ts-btn-fluent-with-icon.join-team-button')

使用driver.find_element_by_css_selector,您可以在选择器中的每个类名之间使用点(.) 将多个类名链接在一起。

【讨论】:

  • 这是不正确的说法,您可以使用 class_name 找到多个类
  • 哦?我在文档中没有看到任何内容说您可以使用该特定方法使用多个类名,使用 CssSelector 是搜索多个类名的正确方法。
  • jusyt 必须用 '.' 替换空格
  • @PDHide 如果您查看此 SO 帖子,则可以接受 find_element_by_class_name() 仅接受一个类名 - (stackoverflow.com/questions/60534244/…)
  • @PDHide 我查阅的每篇文章都说该方法不适用于多个。 (nuomiphp.com/eplan/en/70157.html), (stackoverflow.com/questions/44759907/…)
【解决方案2】:

要点击元素,您可以使用以下任一Locator Strategies

  • 使用css_selector

    driver.find_element_by_css_selector("button.ts-btn.ts-btn-fluent.ts-btn-fluent-secondary.ts-btn-fluent-with-icon.join-team-button[data-tid='tg-discover-team']").click()
    
  • 使用xpath

    driver.find_element_by_xpath("//button[@class='ts-btn ts-btn-fluent ts-btn-fluent-secondary ts-btn-fluent-with-icon join-team-button' and @data-tid='tg-discover-team']").click()
    

由于所需的元素是Angular 元素,理想情况下单击该元素需要诱导WebDriverWaitelement_to_be_clickable(),您可以使用以下Locator Strategies 之一:

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.ts-btn.ts-btn-fluent.ts-btn-fluent-secondary.ts-btn-fluent-with-icon.join-team-button[data-tid='tg-discover-team']"))).click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='ts-btn ts-btn-fluent ts-btn-fluent-secondary ts-btn-fluent-with-icon join-team-button' and @data-tid='tg-discover-team']"))).click()
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

【讨论】:

    【解决方案3】:
    create_team=driver.find_element_by_class_name('ts-btn.ts-btn-fluent.ts-btn-fluent-secondary ts-btn-fluent-with-icon.join-team-button')
    create_team.click()
    

    您必须将空格替换为 .空格表示多类

    您也可以使用 xpath 或 css:

    create_team=driver.find_element_by_xpath("//*[@class='ts-btn.ts-btn-fluent.ts-btn-fluent-secondary ts-btn-fluent-with-icon.join-team-button]')
    create_team.click()
    
    
    create_team=driver.find_element_by_css_selector("[class='ts-btn.ts-btn-fluent.ts-btn-fluent-secondary ts-btn-fluent-with-icon.join-team-button]')
    create_team.click()
    

    更多答案

    如果您从 by_class_name 中检查异常:

    你可以看到它在后台使用 css_class 定位器(你可以看到它在前面自动添加 .)

    工作示例:

    from selenium import webdriver
    
    import time
    
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    driver.get("https://stackoverflow.com/questions/65579491/find-element-by-class-name-in-selenium-giving-error/65579606?noredirect=1#comment115946541_65579606")
    time.sleep(5)
    elem = driver.find_element_by_class_name('overflow-x-auto.ml-auto.-secondary.grid.ai-center.list-reset.h100')
    
    print(elem.get_attribute("outerHTML"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 2011-04-23
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多