等待元素在Selenium中真正可点击

时间:2019-12-03 16:46:17

标签: java selenium

我确实有一个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);
    }
}

我知道这些问题将在整个应用程序中使用相同类型的不同消息发生。因此,如果发生错误,我只需再试一次,如果再次出错,则让它失败。

1 个答案:

答案 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错误的方法。