Selenium的Open功能等到什么?

时间:2009-09-22 14:37:50

标签: unit-testing selenium

当我在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)何时完成加载?

2 个答案:

答案 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 = trueisNewPageLoaded返回的值,因此,doOpen

isNewPageLoaded< = _isNewPageLoaded< = makePageLoadConditionselenium-api.js中调用

doOpen。并且,在Selenium IDE运行open命令后调用doOpen

相关的痕迹是:

doOpen来电(转到selenium-browserbot.jsopenLocation => getCurrentWindow => _modifyWindow => modifySeparateTestWindowToDetectPageLoads(根据上面的评论,等待“通过持续轮询直到文档发生变化并完全加载”)=> pollForLoad => getReadyState

getReadyState返回document.readyStaters),pollForLoad等待rs == 'complete',即直到页面已完全加载,图片等全部。

Ace Ventura解释得比我好。


P.S。 @Dave Hunt,谢谢你的Selenium IDE Flow Control script on GitHub。它派上了用场! :)