好的,我已经按照几个略有不同的例子,正如您在下面的评论代码中看到的那样。他们都声称工作,但我不能这样做。
我正在使用;
- selenium-webdriver
- jasmine-node-reporter-fix
(jasmine-node
错误)
所以这是一个非常简单的异步测试,打开Google并搜索,然后获取页面标题。
问题; 返回的页面标题是Google主页,而不是搜索结果页面。 (浏览器最终出现在搜索结果页面上。)
代码
var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder().
withCapabilities(webdriver.Capabilities.firefox()).
build();
jasmine.DEFAULT_TIMEOUT_INTERVAL = 9999999;
describe('basic test', function () {
it('should be on correct page', function (done) {
//driver.get('http://www.wingify.com');
//driver.getTitle().then(function (title) {
// expect(title).toBe('Wingify');
// // Jasmine waits for the done callback to be called before proceeding to next specification.
// done();
//});
driver.get("http://www.google.com");
driver.findElement(webdriver.By.name("q")).sendKeys("webdriver");
driver.findElement(webdriver.By.name("btnG")).click();
//driver.getTitle().then(function (title) {
// console.log(title);
// console.log(expect);
// expect(title).toBe('webdriver - Google Search');
// done();
//});
driver.wait(function () {
driver.getTitle().then(function (title) {
expect(title).toBe('webdriver - Google Search');
done();
});
}, 5000);
});
});
结果
Failures:
1) basic test should be on correct page
Message:
Expected 'Google' to be 'webdriver - Google Search'.
Stacktrace:
Error: Expected 'Google' to be 'webdriver - Google Search'.
at C:\Stash\Will-Hancock\grunt-jasmine\spec\test-spec.js:31:19
at C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\goog\base.js:1243:15
at webdriver.promise.ControlFlow.runInNewFrame_ (C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\webdriver\promise.js:1539
:20)
at notify (C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\webdriver\promise.js:362:12)
at notifyAll (C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\webdriver\promise.js:331:7)
at resolve (C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\webdriver\promise.js:309:7)
at fulfill (C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\webdriver\promise.js:429:5)
at Object.webdriver.promise.asap (C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\webdriver\promise.js:671:5)
Finished in 4.281 seconds
1 test, 1 assertion, 1 failure, 0 skipped
所以有些人说我需要延长茉莉花超时,这没什么区别。
其他人说你需要Jasmine done()方法 - 如果没有这个,测试就无法完成。
我不明白为什么等待不等! - 无论超时提供什么,结果都会立即返回。
答案 0 :(得分:2)
见this answer - “内部函数将返回一个promise.wait将等待的承诺,并将其值(true / false)作为等待条件”
您应该应用的更改是 -
driver.wait(function () {
return driver.getTitle().then(function (title) {
return title === 'webdriver - Google Search';
});
}, 5000);
答案 1 :(得分:2)
所以,上面的问题是我在使用driver.wait进行断言之前无法让Jasmine等待页面加载。
Jasmine在driver.wait返回之前完成。
相反,我使用了Jasmine的waitsFor()方法。
var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder().
withCapabilities(webdriver.Capabilities.chrome()).
build();
describe('basic test', function () {
it('should be on correct page', function () {
var match = 'webdriver - Google Search',
title = '';
driver.get("http://www.google.com");
driver.findElement(webdriver.By.name("q")).sendKeys("webdriver");
driver.findElement(webdriver.By.name("btnG")).click();
// wait for page title, we know we are there
waitsFor(function () {
driver.getTitle().then(function (_title) {
title = _title;
});
return title === match;
}, 'Test page title, so we know page is loaded', 6000);
// test title is correct
runs(function () {
expect(title).toEqual(match);
});
});
});
答案 2 :(得分:0)
就像你在自己的回答中所说,问题在于你没有等待页面加载。我真的不喜欢driver.wait的方法名称,因为它意味着它会在继续之前等待指定的时间,但事实并非如此。如果您的承诺无法解决,那只是暂停。要等待,您应该使用driver.sleep(1000)。然后你可以添加你的期望,如下:
driver.sleep(1000).then(function () {
return driver.getTitle().then(function (title) {
expect(title).toBe('webdriver - Google Search');
done();
});
});
(因为你在你的问题中使用完了,我假设Jasmine 2.0和done
)
希望这有帮助。