Node.js Firefox不会等待网页加载WebDrivero

Node.js Firefox不会等待网页加载WebDrivero,node.js,selenium,docker,selenium-webdriver,webdriver,Node.js,Selenium,Docker,Selenium Webdriver,Webdriver,我试图使用Selenium运行测试,但遇到了问题。我已经为Chrome浏览器编写了测试。现在我一直在尝试在Firefox浏览器中运行相同的测试,但是失败了 我已经开始调查这个问题,并发现Firefox不会等到页面完全加载后才启动。Chrome可以完美地工作 我正在docker容器中运行Selenium 这是我的剧本 storeSearch(info) { let that = this; return new Promise(function (resolve,

我试图使用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.selectByVisibleTextstore、Tech中选择存储类型,只是抛出一个异常

在使用给定搜索的页面上找不到元素 参数\输入[name='search']\

我试图添加超时,但效果不好,给我一个错误

  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: 不为人知

我已经试着解决这个问题两天了,但到目前为止运气不好

有人能帮忙吗,也许你有一些想法是什么导致了这个问题

谢谢

更新

如果我放一些暂停语句,它会工作,但这真的很糟糕,不是我从这个框架中所期望的。Chrome可以完美地工作。它等待加载条完全加载,然后才执行操作


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

我在Python和C中遇到了很多类似于Selenium的问题,不幸的是在Chrome和Firefox webdrivers中都遇到了。问题似乎在于,代码超越了自身,试图在元素在页面上存在/可见之前引用它们。我在Python中找到的解决方案至少是使用如下等待函数:


如果节点中没有等价的元素,那么您可能必须编写一个自定义方法,每隔一段时间检查源代码中元素在x个时间间隔内的存在情况

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

我正经历着你在上面详细描述的行为,所有在Chrome上的绿色/通过测试的案例,但是在Firefox上,情况就不同了

首先,除非您正在调试,否则不要在测试用例中使用超时或暂停。在这种情况下,将.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构建和维护一个强大的自动化线束,那么您应该考虑创建等待的包并使您的测试用例更可读。请参见下面的示例。单击:

commands.js:


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

你的更新有点扼杀了这个问题。这不是壁虎河的问题,更不用说暂停了。暂停不是最好的做法。请考虑重新阅读我的答案并更新/接受相应的答案。干杯请考虑根据我的回答/以上评论结束问题。同样,这不是GheckoDriver的问题,最好的做法是显式地等待WebElement。干杯
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');
        });
});
}
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")
});
})();