2017-10-04 150 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/