[英]Python selenium webdriver not consistently selecting element even though it's there
[英]Selenium WebDriver cannot click element even though it seems to be visible
在此頁面上 ,使用Python 2,使用Firefox的 Selenium,我正在嘗試讓驅動程序單擊以下按鈕(放大鏡):
<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>
我將以下代碼用於元素的XPath, x = '//*[@id="search-btn"]'
:
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_located
也不presence_of_element_located
。
然而,奇怪的是,在某些情況下,驅動程序實際上已經能夠識別該元素,然后執行driver.find_element_by_xpath(x)
似乎可以找到XPath和.click()
元素。 那時一切正常。 一秒鍾我以為腳本會在頁面加載之前快速執行該操作,但是5秒鍾WebDriverWait
足以加載頁面,在此之前我還有額外的頁面加載睡眠。
該元素似乎不在IFrame中。 我已經通過了“接受條件”按鈕等。
我正在運行最新版本的Firefox(61.0),Selenium(3.13)和Geckodriver(0.21.0)。
這可能是什么問題?
如果我用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()
可以使用以下方法來定位<img>
標記,而不是使用<button>
元素進行更細化的處理:
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()
使用Firefox作為驅動程序,我能夠通過執行JavaScript單擊該元素:
driver.execute_script("window.document.getElementById('search-btn').click()")
請注意,以上是非常規措施,不需要使用。 其他答案是正確的,也是通常的做法。
問題在於Selenium驅動程序無法識別XPath元素,這是由於當前版本的geckodriver(0.21.0)與Selenium(3.13.0)結合存在錯誤 ,請參閱: 出現以下問題時 ,Selenium webdriver管道錯誤:命令之間的差距?
我降級到geckodriver 0.20.1以避免該問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.