Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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 Selenium-等待页面呈现动态页面_Java_Ajax_Angularjs_Selenium_Web - Fatal编程技术网

Java Selenium-等待页面呈现动态页面

Java Selenium-等待页面呈现动态页面,java,ajax,angularjs,selenium,web,Java,Ajax,Angularjs,Selenium,Web,我有一个动态网页,可以刷新和加载新数据。我正在使用Selenium,需要等到页面渲染完成后才能继续检查页面。我看过很多关于等待页面加载或使用显式等待的帖子(隐式等待可以解决问题,但非常不公平,速度不够快)。使用显式等待的问题是没有关于刷新后将出现什么的任何信息。我看到一些解决方案谈到等待与服务器的所有连接结束,但这并不能保证实际的UI已经完成渲染 我需要的是一种方法来知道页面是否已经完成渲染(而不是加载!!)首先,你要知道页面加载后会出现什么样的结构。您不知道页面上没有哪些标记,但您知道DOM的

我有一个动态网页,可以刷新和加载新数据。我正在使用Selenium,需要等到页面渲染完成后才能继续检查页面。我看过很多关于等待页面加载或使用显式等待的帖子(隐式等待可以解决问题,但非常不公平,速度不够快)。使用显式等待的问题是没有关于刷新后将出现什么的任何信息。我看到一些解决方案谈到等待与服务器的所有连接结束,但这并不能保证实际的UI已经完成渲染


我需要的是一种方法来知道页面是否已经完成渲染(而不是加载!!)

首先,你要知道页面加载后会出现什么样的结构。您不知道页面上没有哪些标记,但您知道DOM的外观。这就是为什么通常使用页面文本进行测试是最糟糕的做法,而使用DOM测试网站则是最好的做法。因此,根据页面上显示的结构,您需要有明确的方式等待特定标记出现在页面上。 还有一个解决方案(但正如我所说,这并不是最佳实践)是等待
文档。readystate
是“完成的”。这种状态在任何情况下都不会有帮助,但如果页面上仍有加载内容,则在超过一半的情况下,它不会返回完整。因此,您应该具有某种正在执行的隐式状态:

string readyState = javascript.ExecuteScript("if (document.readyState) return document.readyState;").ToString();
然后检查:

readyState.ToLower() == "complete";
顺便说一句,如果您将使用量角器作为angular js应用程序测试执行器,它将等待默认情况下加载angular页面,或者在某些困难情况下,您可以使用:

browser.waitForAngular();
或者在回调中做些什么

button.click().then(function() {
  // go next step
});

我测试的产品也有类似的问题。例如,我必须为click、click\u checkbox、sendKeys和getText创建特殊函数。其中包括用于处理NoTouchElement StaleElement引用异常的try-catch方法。如果操作失败,例如发送错误的文本,它也会重试

document.readyState

这对你来说还不够。它只等待DOM加载。加载HTML标记时,它返回“complete”。因此,您必须等待每个单独的项目。

这对我来说非常适用于动态呈现的网站-我在获取数据时没有时间限制,因为它会在后台运行,如果效率是一个问题,这可能不是您的解决方案(50秒对于任何网站来说,在就绪状态完成后加载都是一个巨大的时间):

  • 等待加载完整的页面
  • WebDriverWait wait=newwebdriverwait(驱动程序,50);
    等待.until((ExpectedCondition)wd->((JavascriptExecutor)wd).executeScript(“return document.readyState”).equals(“complete”)