Selenium WebDriver - 确定元素是否可点击(即不被dojo模态灯箱遮挡)

时间:2012-03-26 19:31:50

标签: ajax selenium dojo webdriver

我编写了自动化脚本来测试对ajax非常重视的Web应用程序。例如,保存设置时会显示带有文本“Saving...”的模态对话框,而灯箱会使页面的其余部分灰显。

我的测试脚本试图在消息消失之前单击测试中的下一个链接。它几乎总是在驱动Firefox时有效,但在驱动Chrome时会显示以下错误:

Exception in thread "main" org.openqa.selenium.WebDriverException: Element is not clickable at point (99.5, 118.5). Other element would receive the click: <div class="dijitDialogUnderlay _underlay" dojoattachpoint="node" id="lfn10Dijit_freedom_widget_common_environment_Dialog_8_underlay" style="width: 1034px; height: 1025px; "></div> (WARNING: The server did not provide any stacktrace information)

这是因为灯箱遮挡了我要点击的元素。我想在尝试点击链接之前等待灯箱消失。

检查灯箱不再存在不是一个有效的解决方法,因为有时会有多个级别的模态对话框和灯箱,并且没有简单的方法来区分它们。

在Selenium中是否有办法检测元素是否可点击(没有其他元素遮挡它)?尝试/捕获将是一种解决方法,但我更愿意进行适当的检查,如果可能的话。

4 个答案:

答案 0 :(得分:19)

使用WebDriverWait条件。

    WebDriverWait wait = new WebDriverWait(yourWebDriver, 5);
    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//xpath_to_element")));

Webdriver将等待5秒钟,以便能够点击您的元素。

答案 1 :(得分:6)

您可以使用ExpectedConditions.invisibilityOfElementLocated(By by)方法,该方法一直等到元素不可见或不存在于DOM上。

WebDriverWait wait = new WebDriverWait(yourWebDriver, 10);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("yourSavingModalDialogDiv")));

所以,根据你的模态对话框看不见的时间或者关闭DOM的时间,webdriver会等待。等待最多10秒钟。

答案 2 :(得分:2)

您可以创建一个clickUntil函数/方法来执行WebDriver等待,直到该元素可以在超时时单击。它会尝试单击该元素,并且每次都会丢弃“Element is not clickable”错误消息,直到它被单击或超时。

不确定如何在dojo中编写,但这是一个想法。

答案 3 :(得分:0)

在Scala中:

  1. 等待的标准代码(可见性/隐身性)

    (new WebDriverWait(remote, 45)).until(
        ExpectedConditions.visibilityOf(remote.findElement(locator))
    )
    Thread.sleep(3000)
    
  2. 日志中的更多可见性:

    while (remote.findElement(locator).isDisplayed) {
        println(s"isDisplayed: $ii $a : " + remote.findElement(locator).isDisplayed)
        Thread.sleep(100)
    }
    
  3. 如果您有异步JavaScript进程,请使用带时间戳的web元素:

    val oldtimestamp = remote.findElements(locator).get(0).getAttribute("data-time-stamp")
    
    while (oldtimestamp == remote.findElements(locator).get(0).getAttribute("data-time-stamp")) {
        println("Tstamp2:" + remote.findElements(locator).get(0).getAttribute("data-time-stamp"))
        Thread.sleep(200)
    }