当我在Selenium中调用Open(“[some URL]”)方法时,它会等待所有资源(图像,CSS,JS)下载。但是它如何知道浏览器已经完成了请求资源?
这是我的驱动程序代码片段(在C#中):
DefaultSelenium selenium = new DefaultSelenium(
"localhost", 4444, "*iexplore", "http://www.stackoverflow.com");
// open my profile page
selenium.Open("http://stackoverflow.com/users/111934/jeff-meatball-yang");
以上网址仅供参考。如果我在身体setTimeout()
事件处理程序中触发的onload
中有一个非常长的延迟包装的AJAX调用,Selenium实际上不会在继续之前等待该AJAX调用...必须手动告诉Selenium等待WaitForPageToLoad(timeout)
。
那么Selenium如何检测正常页面(没有AJAX)何时完成加载?
答案 0 :(得分:2)
我相信它等待location.href可用,这意味着如果你在此之后运行AJAX,你还需要使用waitForCondition。
selenium.open("http://www.example.com/");
selenium.waitForCondition("var value = selenium.getText('id=pageLoadStatus'); value == 'Loaded'", "60000");
以下是Selenium core的当前页面加载检测代码:
this.recordPageLoad = function(elementOrWindow) {
LOG.debug("Page load detected");
try {
if (elementOrWindow.location && elementOrWindow.location.href) {
LOG.debug("Page load location=" + elementOrWindow.location.href);
} else if (elementOrWindow.contentWindow && elementOrWindow.contentWindow.location && elementOrWindow.contentWindow.location.href) {
LOG.debug("Page load location=" + elementOrWindow.contentWindow.location.href);
} else {
LOG.debug("Page load location unknown, current window location=" + this.getCurrentWindow(true).location);
}
} catch (e) {
LOG.error("Caught an exception attempting to log location; this should get noticed soon!");
LOG.exception(e);
self.pageLoadError = e;
return;
}
self.newPageLoaded = true;
};
答案 1 :(得分:1)
@Dave Hunt,you're correct that recordPageLoad
is called,但它只记录页面加载位置(location.href
)(如果可用)并设置self.newPageLoaded = true
,isNewPageLoaded
返回的值,因此,doOpen
。
isNewPageLoaded
< = _isNewPageLoaded
< = makePageLoadCondition
在selenium-api.js
中调用 doOpen
。并且,在Selenium IDE运行open
命令后调用doOpen
。
相关的痕迹是:
doOpen
来电(转到selenium-browserbot.js
)openLocation
=> getCurrentWindow
=> _modifyWindow
=> modifySeparateTestWindowToDetectPageLoads
(根据上面的评论,等待“通过持续轮询直到文档发生变化并完全加载”)=> pollForLoad
=> getReadyState
。
getReadyState
返回document.readyState
(rs
),pollForLoad
等待rs == 'complete'
,即直到页面已完全加载,图片等全部。
Ace Ventura解释得比我好。
P.S。 @Dave Hunt,谢谢你的Selenium IDE Flow Control script on GitHub。它派上了用场! :)