Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何等待web页面上的WebElement,在测试执行时它有时出现在随机的地方?_Java_Selenium_Dom_Junit_Webdriverwait - Fatal编程技术网

Java 如何等待web页面上的WebElement,在测试执行时它有时出现在随机的地方?

Java 如何等待web页面上的WebElement,在测试执行时它有时出现在随机的地方?,java,selenium,dom,junit,webdriverwait,Java,Selenium,Dom,Junit,Webdriverwait,我为一个web应用程序编写了一个自动化的基于selenium的测试,它们可以在快速的internet连接下完美地运行,但在连接不太好的情况下会出现不可预测的行为 Web应用程序的构建是这样的,如果对Web页面上某个操作的请求

我为一个web应用程序编写了一个自动化的基于selenium的测试,它们可以在快速的internet连接下完美地运行,但在连接不太好的情况下会出现不可预测的行为

Web应用程序的构建是这样的,如果对Web页面上某个操作的请求<的响应持续时间大于250ms,则会出现loader包装器元素,该元素阻止用户执行任何类型的操作,直到响应结束。加载程序包装器可以在测试执行的任何地方的任何请求中出现,所以我不能使用selenium的显式等待,因为我不知道它何时何地出现。因此,我收到一个异常:

org.openqa.selenium.WebDriverException:元素在点(411675)处不可单击。其他元素将收到单击:(.show component.loader包装器)

有没有办法设置一个“全局等待”,如果出现加载程序包装器,它将停止测试执行,并等待直到它结束,然后测试执行将继续?或者任何其他想法。

对于web驱动程序,您可以这样使用

WebElement webElement = (new WebDriverWait(driver, 50))
   .until(ExpectedConditions.elementToBeClickable(By.id("your div id")));
这里50指的是50秒

有关更多详细信息,请参阅下面的链接。

如果我理解正确,您正在寻找

您可以将其作为装饰添加到步骤中


希望这有帮助

我有点喜欢您对注释的想法,但不确定如何实现它

另一种可能的方法是编写您自己的ExpectedCondition“LoaderRapperEnglishe”(或类似的东西),它将等待装入器包装器消失,然后返回目标WebElement,以便您可以链接到它

然后你会像这样使用它

(new WebDriverWait(targetWebElement, 50))
   .until(ExpectedConditions.loaderWrapperDisappeared(By.id("your div id"))).click();

(请原谅语法错误……我已经好几年没写java了)

如果我错了,请纠正我。您的建议是设置显式等待web元素?如果是的话,那就帮不了我。因为每次这个例外出现在不同的地方(点击不同的WebElements)。我不能在每个webelement上设置等待。实际上,selenium就是这样工作的,因为在动态的情况下,有些会很快出现,而有些可能需要更多的时间,具体取决于响应时间。您只能在全局范围内以秒为单位创建时间。我正在探索某种等待,可能是在Junit的@Before注释中声明的,并且只等待具有特定上下文的特定异常。如果在点击某个webelement时抛出异常,异常符合规则,那么它会处理它,等待并重复点击2-4次,拉取间隔为500,因为如果我知道webelement,那么找到的ElementVisibility将解决我的问题,什么会导致异常。我在编程方面没有那么强。你的意思是:你可以将它作为一个装饰器添加到你的stepsa装饰器基本上是一种用另一个函数包装函数的方法。。。我一直在Python中使用它。。。不知道如何在java中实现……但就您的观点而言,您需要知道加载的元素。。。这是等待它消失的唯一方法这里给你举个例子:但这种方法意味着,我应该在任何可能发生的地方使用它。在我的例子中,大约有100个测试和大量的Web元素。这对我来说不合适。任何基于ExpectedCondition的等待(据我所知)的主要问题是它们应该在特定的位置声明。在我的例子中,我不知道哪一个WebElement会导致异常。因此,所有targetWebElement.click()调用都会执行上述操作,其中WebDriverWait()的第一个参数不是驱动程序,而是targetWebElement。是的,这将是一个痛苦的过程,值得包装到其他一些自定义类中,但这完全取决于您的自动化框架是如何设置的。@BreaksSoftware我认为您不需要编写自己的
ExpectedCondition
只需使用
invisibilityOfElementLocated
。。。但这是一个很好的答案+直到解决这个问题。我将在最终找到解决方案时发布。