【问题标题】:Click on label Selenium automation点击标签 Selenium 自动化
【发布时间】:2020-12-10 16:21:53
【问题描述】:

我在使用 selenium 选择此软件中的 RUC 选项时遇到问题,标签不包含区分它们的 id 并且类是相同的:

HTML elements

我正在使用以下代码,但它对我不起作用:

label_tipo_documento = driver.find_element_by_xpath('//div[@id="form-group-tipo_documento"]//div[@class="col-sm-3"]//label[@class="radio-inline"][2]')
print(label_tipo_documento.text)
label_tipo_documento.click()

我尝试在标签 [2] (RUC) 中选择第二个选项,然后收到以下消息:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@id="form-group-tipo_documento"]//div[@class="col-sm-3"]//label[@class="radio-inline"][2]"}
  (Session info: chrome=87.0.4280.88)

但是,当我使用 [1] 而不是 [2] 时,它会找到一个值:

DNI

【问题讨论】:

    标签: python selenium xpath css-selectors webdriverwait


    【解决方案1】:

    要单击与文本关联的元素为 RUC,您可以使用以下任一Locator Strategies

    • css_selector 用于<input>

      driver.find_element_by_css_selector("div#form-group-tipo_documento label.radio-inline > input[value='RUC']").click()
      
    • 使用xpath<label> 文本

      driver.find_element_by_xpath("//div[@id='form-group-tipo_documento']//label[@class='radio-inline' and contains(., 'RUC')]/input").click()
      

    理想情况下,点击你需要诱导WebDriverWaitelement_to_be_clickable()的元素,你可以使用以下Locator Strategies之一:

    • 使用CSS_SELECTOR:

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div#form-group-tipo_documento label.radio-inline > input[value='RUC']"))).click()
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='form-group-tipo_documento']//label[@class='radio-inline' and contains(., 'RUC')]/input"))).click()
      
    • 注意:您必须添加以下导入:

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

    参考文献

    您可以在NoSuchElementException 中找到一些相关讨论:

    【讨论】:

    【解决方案2】:

    使用xpath点击第二个单选按钮。

    label_tipo_documento = driver.find_element_by_xpath("//label[./input[@value='RUC']]")
    print(label_tipo_documento.text)
    label_tipo_documento.click()
    

    如果你想使用索引,那么试试这个代码。

    label_tipo_documento = driver.find_element_by_xpath('(//div[@id="form-group-tipo_documento"]//div[@class="col-sm-3"]//label[@class="radio-inline"])[2]')
    print(label_tipo_documento.text)
    label_tipo_documento.click()
    

    【讨论】:

    • 这会起作用,使用 find_elements_by_xpath 然后在 python 而不是 xpath 中进行索引可能会更好。
    【解决方案3】:
    //div[@id="form-group-tipo_documento"]//div[@class="col-sm-3"]//label[@class="radio-inline"][2]
    

    表示您要选择div 节点的第二个后代标签(它只有一个后代标签)。而您需要选择标签的第二个出现。所以要么尝试

    label_tipo_documento = driver.find_element_by_xpath('(//div[@id="form-group-tipo_documento"]//div[@class="col-sm-3"]//label[@class="radio-inline"])[2]')
    

    label_tipo_documento = driver.find_elements_by_xpath('//div[@id="form-group-tipo_documento"]//div[@class="col-sm-3"]//label[@class="radio-inline"]')[1]
    

    【讨论】:

      【解决方案4】:

      早上好。

      所以,根据你的形象,我相信你需要的xpath就是这个。

      # XPATH
      //div[contains(@id, 'tipo_documento')]//label[@class='radio-inline']//input[@value='DNI']
      

      基于这个xpath,你应该为你想要点击的radio button创建一个变量,然后使用以下命令执行它。

      myValue = "DNI"
      driver.find_element(By.XPATH, "//div[contains(@id, 'tipo_documento')]//label[@class='radio-inline']//input[@value='{0}']".format(myValue)).click()
      

      根据此代码,您可以将“DNI”更改为“RUC”或“CEX”,您应该一切顺利。

      【讨论】:

        猜你喜欢
        • 2013-12-15
        • 1970-01-01
        • 2013-07-19
        • 2021-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-17
        相关资源
        最近更新 更多