Selenium WebDriver即使看起来似乎也无法单击元素

时间:2018-06-29 11:17:59

标签: python python-2.7 selenium selenium-webdriver

在此page上,使用Python 2,使用 Firefox 的Selenium,我尝试让驱动程序单击以下按钮(放大镜):

enter image description here

<button id="search-btn" type="button" class="header__user-menu-item header__search-btn">
          <span class="sr-only">Search</span>
          <img src="/sites/default/themes/custom/smp_bootstrap/images/search.svg" class="header__user-menu-icon fa fa-search fa-fw" alt="Search">
        </button>

我对元素x = '//*[@id="search-btn"]'的XPath使用以下代码:

x = '//*[@id="search-btn"]'

try:
    element = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, x)))
except:
    print "Element not clickable"
else:
    found_element = driver.find_element_by_xpath(x)
    try:
        found_element.click()
    except:
        raise

硒的常见异常EC.element_to_be_clickable不能标识元素,visibility_of_element_locatedpresence_of_element_located也不能。

然而,奇怪的是,在某些情况下,驱动程序实际上已经能够识别该元素,然后执行driver.find_element_by_xpath(x),这似乎可以找到XPath和.click()元素。那时一切正常。有一秒钟,我认为脚本可以在页面加载之前快速执行操作,但是5秒WebDriverWait足以加载页面,在此之前我还有额外的页面加载睡眠。

该元素似乎不在IFrame中。我已经通过“接受条件”按钮等了。

我正在运行最新版本的Firefox(61.0),Selenium(3.13)和Geckodriver(0.21.0)。

这里可能是什么问题?

3 个答案:

答案 0 :(得分:1)

如果我使用By.ID而不使用By.XPATH来获得此功能,也许是您输入了错误的xpath

如果使用xpath也可以x = '//*[@id="search-btn"]'

id = 'search-btn'
element = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.ID, id)))
element.click() 

答案 1 :(得分:1)

您可以按以下方式定位<button>标签,而不是使用<img>元素进行更精细的定位:

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//img[@class='header__user-menu-icon fa fa-search fa-fw' and @alt='Search']"))).click()

答案 2 :(得分:0)

使用Firefox作为驱动程序,我能够通过执行JavaScript单击该元素:

AppConfig.URL_UsersList

请注意,以上是非常规措施,不需要使用。其他答案是正确的,也是通常的做法。

问题在于Selenium驱动程序无法识别XPath元素,这是由于当前版本的geckodriver(0.21.0)与Selenium(3.13.0)结合存在错误,请参见:Broken pipe error selenium webdriver, when there is a gap between commands?

我降级到geckodriver 0.20.1以避免该问题。