Selenium WebDriver -确定元素是否可点击(即,不被Dojo模态lightbox遮挡)

kgsdhlau  于 2022-12-08  发布在  Dojo
关注(0)|答案(5)|浏览(210)

我编写了自动化脚本来测试 AJAX 上非常繁重的Web应用程序,例如,保存设置时显示的模式对话框带有文本“Saving...“,而lightbox使页面的其余部分变灰。
我的测试脚本试图在消息消失之前点击测试中的下一个链接。在驱动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)

这是因为lightbox挡住了我想要点击的元素。我想等lightbox消失后再点击链接。
检查lightbox是否不再存在并不是一个有效的解决方法,因为有时存在多个级别的模式对话框和lightbox,并且没有简单的方法来区分它们。
在Selenium中是否有一种方法来检测元素是否是可点击的(没有其他元素遮挡它)?try/catch是一种解决方法,但如果可能的话,我更愿意做一个适当的检查。

zfciruhq

zfciruhq1#

使用WebDriverWait条件。

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

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

zzwlnbp8

zzwlnbp82#

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

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

所以,根据你的模式对话框消失或离开DOM所需的时间,webdriver会等待,最多等待10秒。

n8ghc7c1

n8ghc7c13#

您可以创建一个clickUntil函数/方法,让WebDriver等待直到元素可单击并超时。它会尝试单击元素,并丢弃“Element is not clickable”错误消息,直到每次都被单击或超时。
不知道如何在dojo中写,但这是一个想法。

sg24os4d

sg24os4d4#

我也有同样的问题,但我测试了许多输入在网站上。一个是可点击的,我测试和其他-不是可点击的一个刚刚跳过。我做了它的try()catch()简单的代码:

for(){ // for all my input
try {
    driver.findElement(By.xpath("...."
                                + "//input)["+(i+1)+"]")).click();

  ... tests...

} catch(Exception e) {
     if(e.getMessage().contains("is not clickable at point")) {

          System.out.println(driver.findElement(By.xpath(locator)).
          getAttribute("name")+" are not clicable");
     } else {
          System.err.println(e.getMessage());
     }
}

而且更加优雅:

@SuppressWarnings("finally")
       public boolean tryClick(WebDriver driver,String locator, locatorMethods m) {

           boolean result = false;
           switch (m) {

           case xpath:
            try {
                driver.findElement(By.xpath(locator)).click();
                result= true;
            } catch (Exception e) {
                   if(e.getMessage().contains("is not clickable at point")) {
                       System.out.println(driver.findElement(By.xpath(locator)).getAttribute("name")+" are not clicable");
                   } else {
                       System.err.println(e.getMessage());
                   }
            } finally {
                break;
            }
        case id:
            try {   
                driver.findElement(By.id(locator)).click();
                return true;
            } catch (Exception e) {
               if(e.getMessage().contains("is not clickable at point")) {
                   System.out.println(driver.findElement(By.id(locator)).getAttribute("name")+" are not clicable");   
               } else {
                   System.err.println(e.getMessage());
               }
            } finally {
                break;
            }

          default:
              System.err.println("Unknown locator!");

        }
           return result;
  }
1sbrub3j

1sbrub3j5#

在Scala中:
1.等待标准代码(可见/不可见)

(new WebDriverWait(remote, 45)).until(
    ExpectedConditions.visibilityOf(remote.findElement(locator))
)
Thread.sleep(3000)

1.日志中的更多可见性:

while (remote.findElement(locator).isDisplayed) {
    println(s"isDisplayed: $ii $a : " + remote.findElement(locator).isDisplayed)
    Thread.sleep(100)
}

1.如果有异步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)
}

相关问题