Node.js Firefox不会等待网页加载WebDrivero
我试图使用Selenium运行测试,但遇到了问题。我已经为Chrome浏览器编写了测试。现在我一直在尝试在Firefox浏览器中运行相同的测试,但是失败了 我已经开始调查这个问题,并发现Firefox不会等到页面完全加载后才启动。Chrome可以完美地工作 我正在docker容器中运行Selenium 这是我的剧本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,
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")
});
})();