Firefox不等待页面加载Webdriverio

时间:2017-05-14 14:42:55

标签: node.js selenium docker selenium-webdriver webdriver

我正在尝试使用Selenium运行我的测试,刚刚遇到问题。我为Chrome浏览器编写了测试。现在我一直在尝试在Firefox浏览器中运行相同的测试,但是他们失败了。

我已经开始研究这个问题,发现Firefox不会等到页面完全加载。 Chrome运作完美。

我在docker容器中运行Selenium

这是我的剧本

storeSearch(info) {
        let that = this;
        return new Promise(function (resolve, reject) {
            browserClient.init()
                .url("http://somewhere.com")
                .selectByVisibleText("#store","Tech")
                // Redirect to a new page
                .setValue("input[name='search']", info.searchCriteria)
                .selectByValue(".featured", 'MacBook')
                .click("button[name='info']")
                .element('.popup')
                .then(function (element) {
                    if (element.state === 'success') {

                    }
                });
        });
    }

它甚至不会尝试从select .selectByVisibleText("#store","Tech")中选择商店类型,只会引发异常。

  

“使用给定的搜索无法在页面上找到元素   参数(\“input [name ='search'] \”)。“,

我尝试添加timeouts,但它不起作用并给我一个错误。

  browserClient.init()
                    .url("http://somewhere.com")
                    .timeouts('pageLoad', 100000)
                    .selectByVisibleText("#store","Tech")

抛出以下错误。

  

“未知等待类型:pageLoad \ nBuild信息:版本:'3.4.0',修订版:   '未知',时间:'未知'\ n系统信息:主持人:'ef7581676ebb',ip:   '172.17.0.3',os.name:'Linux',os.arch:'amd64',os.version:   '4.9.27-moby',java.version:'1.8.0_121'\ n驱动信息:driver.version:   未知

我一直试图解决这个问题两天,但到目前为止没有运气。

有人可以提供帮助,也许你有一些想法会导致问题吗?

感谢。

更新

 .url("http://somewhere.com")
                .pause(2000)
                .selectByVisibleText("#store","Tech")

如果我放了一些pause语句就行了,但这真的很糟糕,而不是我对这个框架的期望。 Chrome运作完美。它等待直到加载条完全加载,然后才执行操作。

问题在于geckodriver我想,我已经在Python中测试了相同的流程,Java并且行为完全相同。

3 个答案:

答案 0 :(得分:2)

我正在体验您在​​上面详述的确切行为,Chrome中的全绿/通过测试用例,但在Firefox上则是另一回事。

首先,从不在您的测试用例中使用timeoutspause,除非您正在调试。在这种情况下,先前将.debug()链接到失败的步骤/命令实际上会做得更好。

我在waitUntill()中包装了所有 WDIO 命令,之后我在Firefox中看到了绿色。请看下面的代码:

storeSearch(info) {
let that = this;
return new Promise(function (resolve, reject) {
    browserClient.init()
        .url("http://somewhere.com")
        .waitUntil(function() {
            return browser
                .isExisting("#store");  
        }, yourTimeout, "Your custom error msg for this step")
        .selectByVisibleText("#store","Tech")
        // Redirect to a new page
        .waitUntil(function() {
            return browser
                .setValue("input[name='search']", info.searchCriteria); 
        }, yourTimeout, "Your custom error msg for this step")
        .waitUntil(function() {
            return browser
                .selectByValue(".featured", 'MacBook'); 
        }, yourTimeout, "Your custom error msg for this step")
        .waitUntil(function() {
            return browser
                .click("button[name='info']");  
        }, yourTimeout, "Your custom error msg for this step")
        .waitUntil(function() {
            return browser
                .isExisting(".popup");  
        }, yourTimeout, "Your custom error msg for this step")
        .element('.popup')
        .then(function (element) {
            assert.equal(element.state,'success');
        });
});
}

它不漂亮,但它为我完成了这项工作。希望对你也有好处。

增强功能:如果您打算实际建设&使用 WDIO 维护强大的自动化线束,然后您应该考虑创建包含等待和放大的custom commands使您的测试用例更具可读性。请参阅.click()的示例:

commands.js

module.exports = (function() {
browser.addCommand('cwClick', function(element) {
    return browser
        .waitUntil(function() {
            return browser.isExisting(element);
        }, timeout, "Oups! An error occured.\nReason: element(" + element + ") does not exist")
        .waitUntil(function() {
            return browser.isVisible(element);
        }, timeout, "Oups! An error occured.\nReason: element(" + element + ") is not visible")
        .waitUntil(function() {
            return browser.click(element);
        }, timeout, "Oups! An error occured.\nReason: element(" + element + ") could not be clicked")
});
})();

剩下要做的就是通过测试用例文件中的require()导入您的模块:var commands = require('./<pathToCommandsFile>/commands.js');

答案 1 :(得分:1)

您可以在javascript中使用等待网站状态的代码。 在C#中看起来像这样:

public void WaitForPage(IWebDriver driver, int timeout = 30)
    {
        IWait<IWebDriver> wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeout));
        wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
    }

答案 2 :(得分:0)

我在Python和C#中遇到过像Selenium这样的很多问题,不幸的是在Chrome和Firefox网络驱动程序中。问题似乎是代码超前于自己并尝试在元素存在之前引用/在页面上可见。我在Python中找到的解决方案至少是使用像这样的Wait函数:http://selenium-python.readthedocs.io/waits.html

如果节点中没有等效节点,则可能必须编写自定义方法以经常检查源,以确定x间隔中元素的存在。