繁体   English   中英

Firefox不等待页面加载Webdriverio

[英]Firefox doesn't wait for a page load Webdriverio

我正在尝试使用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 \\ n构建信息:版本:'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:未知

我已经尝试解决这一问题已有两天了,但是到目前为止还没有运气。

有人可以帮忙,也许您有什么想法可以引起问题?

谢谢。

UPDATE

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

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

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

我在上面详细描述了您的确切行为,在Chrome中为全绿色/通过测试用例,但在Firefox中,情况却完全不同。

首先,除非进行调试,否则请勿使用timeouts或在测试用例中pause 在这种情况下,将.debug()事先链接到失败的步骤/命令实际上会做得更好。

我将所有WDIO命令都包装在waitUntill() ,然后在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实际构建和维护强大的自动化工具,则应考虑创建打包等待的定制命令 ,并使测试用例更具可读性。 请参见下面的.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');

您可以使用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"));
    }

我在Python和C#中遇到了很多类似的Selenium问题,不幸的是在Chrome和Firefox Webdrivers中。 问题似乎是代码先于自身,并试图在元素甚至不存在/在页面上可见之前就对其进行引用。 我在Python中找到的解决方案至少是使用这样的Wait函数: http : //selenium-python.readthedocs.io/waits.html

如果节点中没有等效项,则可能必须编写一种自定义方法,以经常检查源中是否存在x个间隔内的元素(随着时间的推移)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM