【问题标题】:Selenium Click button whitout idSelenium 点击按钮没有 id
【发布时间】:2022-01-28 00:07:49
【问题描述】:

我必须单击第一个 li 的 input type="button" 元素,但我不能引用 li 的 id,因为它每第二次打开网站,这是我尝试过的

driver.find_elements_by_xpath('//input[data-componentname="gender"]').get(0).click()

它给了我这个错误:

AttributeError: 'list' object has no attribute 'get'

如果我删除 get 部分,这是错误:

AttributeError: 'list' object has no attribute 'click'

这是代码,就像我说的,我必须单击第一个输入而不参考 id

<ul data-componentname="gender">
    
      <li id="78ece221-1b64-4124-8483-80168f21805f" class="">
        <input type="button">
        <span>Uomo</span>
      </li>
    
      <li id="2678a655-b610-41e0-8e7f-bad58fbcb1b3" class="">
        <input type="button">
        <span>Donna</span>
      </li>
    
  </ul>

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    要点击元素Uomo,你需要为element_to_be_clickable()诱导WebDriverWait,你可以使用以下Locator Strategies之一:

    • 使用CSS_SELECTOR

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "ul[data-componentname='gender'] li:nth-of-type(1) span"))).click()
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//ul[@data-componentname='gender']//span[text()='Uomo']"))).click()
      
    • 注意:您必须添加以下导入:

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

    浏览器快照:

    【讨论】:

      【解决方案2】:

      find_elements 方法返回一个网络元素列表。
      列表的第一个成员可以通过简单的索引接收,即list_object[0]
      此外,由于您想获得与 //input[data-componentname="gender"] 定位器匹配的第一个元素,您可以简单地使用 find_element 方法。
      所以,而不是

      driver.find_elements_by_xpath('//input[data-componentname="gender"]').get(0).click()
      

      你可以使用

      driver.find_element_by_xpath('//input[data-componentname="gender"]').click()
      

      或者

      driver.find_elements_by_xpath('//input[data-componentname="gender"]')[0].click()
      

      UPD
      好吧,您尝试使用错误的定位器。
      这应该有效:

      driver.find_element_by_xpath("//ul[@data-componentname='gender' ]//span[text()='Uomo']/../input").click()
      

      您也可以单击包含“Uomo”文本本身的元素

      driver.find_element_by_xpath("//ul[@data-componentname='gender' ]//span[text()='Uomo']").click()
      

      【讨论】:

      • 我第一个得到这个错误:AttributeError: 'list' object has no attribute 'click' 第二个:IndexError: list index out of range 我可能需要点击里面的输入类型按钮列表而不是列表..
      • 表示列表为空。请分享您的所有代码,包括您正在处理的页面的链接或整个页面的 HTML。
      • nike.com/it/register这是页面,我需要点击国家下拉菜单下方的Uomo按钮
      • 查看我的更新答案,如果现在还可以,请告诉我
      【解决方案3】:

      如果你只需要,你可以包含第一个 li。例如:

      driver.find_element_by_xpath('//input[data-componentname="gender"]/li[1]')
      

      如果你想要这个列表,那么你可以这样做

      driver.find_elements_by_css_selector('input[data-componentname="gender"] > li')
      

      并根据您要单击的按钮执行 .get()

      【讨论】:

      • 您可以缩进您的代码以获得更好的可读性吗?
      猜你喜欢
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2023-03-31
      • 1970-01-01
      • 2023-02-24
      • 2021-07-28
      • 1970-01-01
      相关资源
      最近更新 更多