代码之家  ›  专栏  ›  技术社区  ›  undetected Selenium

如何使用Selenium和Python点击输入元素

  •  0
  • undetected Selenium  · 技术社区  · 4 年前

    我试图点击带有文本的标签 Python Selenium documentation 网站。

    HTML:

    <input type="radio" name="tabsetcode2" id="tab1code2" aria-controls="pythoncode2">
    

    但我面临 TimeoutException :

    selenium.common.exceptions.TimeoutException: Message:
    

    代码试验:

    driver.get('https://www.selenium.dev/documentation/en/')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[aria-controls='pythoncode2']"))).click()
    

    有人能帮我点击 python 标签?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Arundeep Chohan    4 年前

    你可以点击标签,它就起作用了。

    driver.get('https://www.selenium.dev/documentation/en/')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@for='tab1code2']"))).click()
    
        2
  •  0
  •   Etch    4 年前

    尝试使用xpath等待

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, '*//div[@class="tabset"]/label[2]'))).click()
    

    如果仍然不起作用,试着等到可见

    WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.XPATH, '*//div[@class="tabset"]/label[2]'))).click()
    
        3
  •  0
  •   Nic Laforge    4 年前

    该元素确实是可点击的。但它有一个标签。

    有关绑定标签和信息的更多信息 here

    使用 EC.element_to_be_clickable 还要确保元素可见,但事实并非如此。

    class element_to_be_clickable(object):
        """ An Expectation for checking an element is visible and enabled such that
        you can click it."""
    

    您可以通过拨打电话确认它是可点击的 is_enabled 。此方法仅验证属性 disabled 这不是假的。

    driver.find_element_by_css_selector("input[aria-controls='pythoncode2']").is_enabled()
    

    或者

    driver.find_element_by_css_selector("input[aria-controls='pythoncode2']").get_attribute('disabled') != "true"
    

    结果:

    True
    

    但是 EC.element_to_be_clickable 也致电 is_displayed 确定元素是否也可见

    driver.find_element_by_css_selector("input[aria-controls='pythoncode2']").is_displayed()
    

    结果:

    False
    

    这就是为什么,无论你等多久,它永远不会成为现实。

    要单击输入元素,您可能会以标签元素为目标。它们与属性绑定在一起 for=id

    就你的情况而言

    driver.find_element_by_css_selector('[for="tab1code2"]')
    

    也:

    driver.find_element_by_css_selector('[for="tab1code2"]').is_enabled()
    driver.find_element_by_css_selector('[for="tab1code2"]').is_displayed()
    

    两者均返回: True

        4
  •  0
  •   gordon so    4 年前

    首先,倾向于使用Id>Css选择器>XPath。因此,示例代码可能是 (By.CSS_SELECTOR, "#pythoncode2") 或更好 (By.ID, "pythoncode2") .

    然而,无论如何,这都不是一个可点击的元素,所以尽管等待了20秒,它总是会达到超时,等待它变得“可点击”。(单选按钮的圆圈具有以下样式 left -1704px 如果您通过F12在浏览器上进入“开发人员模式”并选择该选项卡,则该选项卡将关闭。驱动程序认为其视口之外的任何内容都是不可点击的)

    可点击元素是目标标签;没有Id,但你可以通过CSS找到它: (By.CSS_SELECTOR, "label[for=tab1code2]")

    以下是我的工作代码来证明它的工作原理:

    from selenium import webdriver
    
    if __name__ == '__main__':
        driver = webdriver.Chrome("./chromedriver")
        driver.get('https://www.selenium.dev/documentation/en/')
        driver.find_element_by_css_selector("label[for=tab1code2]").click()
    
        5
  •  0
  •   Ammar Faizi    4 年前

    如果您尝试使用所选的css选择器单击元素,则会抛出以下异常:

    ElementNotInteractableException: Message: element not interactable"
    

    原因在于 type="radio" 属性。

    相反,您应该尝试使用以下css选择器单击下面的标签元素:

    ("label[for=tab1code2]")
    

    所以,你的代码应该看起来像:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label[for=tab1code2]"))).click()