我正在尝试使用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并且行为完全相同。
答案 0 :(得分:2)
我正在体验您在上面详述的确切行为,Chrome中的全绿/通过测试用例,但在Firefox上则是另一回事。
首先,从不在您的测试用例中使用timeouts
或pause
,除非您正在调试。在这种情况下,先前将.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间隔中元素的存在。