发现Python Selenium Webdriver元素但无法单击它

时间:2018-04-12 12:22:05

标签: javascript python selenium checkbox webdriver

目标是点击登录页面上的复选框。 我通过XPATH找到了元素,但是无法点击它。

>>> elem = driver.find_element_by_xpath("//input[@type='checkbox'][@name='conditions']")
>>> elem.is_displayed()
False
>>> elem.is_enabled()
True
>>> elem.get_attribute('outerHTML')
u'<input type="checkbox" class="custom-control-input" name="conditions">'

当我尝试elem.click()时,会发生异常: selenium.common.exceptions.ElementNotVisibleException: Message: element not visible但元素清晰可见,因为页面已加载,我在终端工作。

使用其他选择器时的其他错误是: driver.find_element_by_xpath('/html/body/div[2]/main/section/div/div[3]/div/div[1]/form/p[1]/label/input').click()

selenium.common.exceptions.WebDriverException: Message: unknown error: Element <input type="checkbox" class="custom-control-input" name="conditions"> is not clickable at point (51, 549). Other element would receive the click: <span class="custom-control-description font-weight-regular">...</span>

我尝试注入JavaScript但没有工作。 driver.execute_script("arguments[0].style.visibility = 'visible';",elem)

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您可以使用此XPATH: - //input[@type='checkbox'and @name='conditions']

对于以下错误: - 在点击事件之前使用等待

selenium.common.exceptions.WebDriverException:消息:未知错误:元素在点(51,549)处无法点击。其他元素会收到点击:...

答案 1 :(得分:0)

根据您的代码试用尝试:

elem.click()

你看到了:

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

这意味着在HTML DOM

中仍然看不到所需的元素

甚至在您尝试点击之前:

elem.is_displayed()

你看到了:

False

但是当你尝试:

elem.is_enabled()

你看到了:

True

因此结合所有这些观察结果可能是以下情况之一:

  • 元素在 DOM 存在,但仍然不可见/可互动。在这种情况下,您需要引导 WebDriverWait ,然后按如下方式调用click()

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@type='checkbox' and @name='conditions']"))).click()
    
  • 元素在 DOM 存在,但不在Viewport内。在这种情况下,您需要调用execute_script()将元素置于视口中,然后按如下方式调用click()

    elem = driver.find_element_by_xpath("//input[@type='checkbox' and @name='conditions']")
    driver.execute_script("arguments[0].scrollIntoView(true);", elem)
    elem.click()
    
  • 您调整的定位器策略可能不是唯一的,并且可以识别多个 WebElements ,并且可能隐藏要识别的第一个元素。在这种情况下,is_displayed()将始终返回 False ,您必须构建一个唯一的定位器策略,它唯一地标识所需的元素。
  • 元素的 style 属性可能设置为 display:none; ,在这种情况下,您必须使用{{1}方法如下:

    execute_script()