我确实有一个Select,并且我尝试耐心等待它可用,但是那不会。
WebDriverWait wait = new WebDriverWait(getWebDriver(), 20);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("myxpath")));
Select select = new Select(element);
select.selectByVisibleText(text);
当我在此特定元素上运行代码时,我收到一条错误消息:
... is not clickable at point (1311,183) because another element <p class="ng-tns-c4-0"> obscures it
我想这是因为页面的这些烦人的状态消息在右上角显示了几秒钟,然后消失了。尽管它们与我的下拉列表相去甚远,但它们似乎仍然模糊不清。
如果我添加一个2秒的显式等待,整个过程就起作用了,但是以某种方式冒犯了我的阶梯感,我很可能最终会将它们散布到整个测试中,并使它们放慢很多速度。
是否有任何通用的方式等待元素被遮盖?我的意思是不必知道会弹出哪些特定消息的方法。
POSTSCRIPT: 由于我无法自己添加答案,因此添加了此附言。最后,我已经解决了这个问题:
protected void secureSelect(String text, Select select) {
try {
select.selectByVisibleText(text);
} catch(ElementClickInterceptedException e) {
Wait.seconds(2);
select.selectByVisibleText(text);
}
}
我知道这些问题将在整个应用程序中使用相同类型的不同消息发生。因此,如果发生错误,我只需再试一次,如果再次出错,则让它失败。
答案 0 :(得分:1)
要回答您的最后一个问题,是否存在一种通用的方式来等待元素被遮盖?在elementToBeClickable
之外,不是真的。网页是动态的,每个网页加载内容的方式都不相同,因此并不能一概而论。不幸的是,elementToBeClickable
在您的情况下遇到了ClickIntercepted
错误,但是有一些解决方法。
如果遇到以下阻碍,您可以尝试增加invisibilityOfAllElements
的等待状态,以不断弹出状态消息:
wait.until(ExpectedConditions.invisibilityOfAllElements(By.xpath("//p[contains(@class, 'ng-tns')]")));
这可能会遇到超时异常,具体取决于所显示的p
元素与其余页面内容相比的性质。另一个可能的解决方法是将您的代码保留下来,并使用Javascript从Select
中选择元素:
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("myxpath")));
JavascriptExecutor js = (JavascriptExecutor)driver;
// expand the Select dropdown
js.executeScript("arguments[0].click();", element);
// wait for Select options menu to expand
WebElement optionToClick = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("xPathForDropdownOption")));
// select desired option
js.executeScript("arguments[0].click();", optionToClick);
上面的代码在我们等待的过程中更具“显式性”,特别是下拉选项值。同时点击Select
下拉菜单和Javascript的下拉选项是解决ClickIntercepted
错误的方法。