2017-10-04 147 views
0

我有一個代碼告訴Selenium等待一個元素可點擊,但由於某種原因,Selenium並沒有等待,而是單擊該元素並立即在點(x,y)處引發一個不可點擊的元素。任何想法如何解決這個問題?Selenium顯式等待不起作用

x = '//*[@id="arrow-r"]/i' 
driver = webdriver.Chrome(path) 
driver.get('https://www.inc.com/inc5000/list/2017') 
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, x))) 
driver.find_element_by_xpath(x).click() 
+0

什麼是EC類點擊的問題? – cezarypiatek

+0

@cezarypiatek預期條件 –

+0

EC.element_to_be_clickable檢查元素是否可見並啓用。就可見性而言,它不包括元素落後於其他情況的情況。也許你的頁面使用類似blockUI部件的東西,click()會在封面消失之前發生。 – cezarypiatek

回答

0

這裏是將「等待」部分中的鏈接,Python的硒文檔:Click here

等待將是這樣的:

element = WebDriverWait(driver, 10).until(
    EC.visibility_of((By.XPATH, "Your xpath")) 
) 
element.click(); 
+0

它仍然不會工作。 –

+0

你現在得到哪個錯誤? – zsbappa

+0

點 –

1

EC.element_to_be_clickable檢查,如果元素是可見的並啓用。就可見性而言,它不包括元素落後於其他情況的情況。也許你的頁面使用類似blockUI部件的東西,click()會在封面消失之前發生。您可以通過豐富EC.element_to_be_clickable((By.XPATH,x))檢查確定元素是否真正可點擊,並斷言確保元素沒有被其他元素拋在後面。在我的項目中,我使用的實現如下:

static bool IsElementClickable(this RemoteWebDriver driver, IWebElement element) 
{ 
    return (bool)driver.ExecuteScript(@" 
      (function(element){ 
       var rec = element.getBoundingClientRect(); 
       var elementAtPosition = document.elementFromPoint(rec.left+rec.width/2, rec.top+rec.height/2); 
       return element == elementAtPosition || element.contains(elementAtPosition); 
      })(arguments[0]); 
    ", element); 
} 

此代碼是C#,但我敢肯定,你可以很容易地轉換成您所選擇的編程語言。

更新: 我寫了一篇博客文章涉及與硒框架https://cezarypiatek.github.io/post/why-click-with-selenium-so-hard/