在 Selenium Webdriver 使用 Jasmine JS 进行测试期间,我无法切换窗口.
I can't switch windows during my testing by Selenium Webdriver using Jasmine JS.
跑步者:量角器 JS
平台:Node.JS 上的 Selenium Webdriver
Platform: Selenium Webdriver on Node.JS
代码框架:Jasmine JS
Code framework: Jasmine JS
代码如下,请注意第二个代码块:
The code is below, Please note the second code block:
describe('payments', function() {
// beforeEach(function() {
// browser.ignoreSynchronization = true;
// });
// afterEach(function(){
// browser.ignoreSynchronization = false;
// });
this.selectWindow = function (index) {
browser.driver.wait(function() {
return browser.driver.getAllWindowHandles().then(function (handles) {
if(handles.length > index) {
return true;
}
});
});
return browser.driver.getAllWindowHandles().then(function (handles) {
return browser.driver.switchTo().window(handles[index]);
});
};
it('Client LiveSite - Payments - Perform a payment', function() {
browser.driver.get("https://www.vcita.com/v/bungee/home");
browser.driver.sleep(5000);
element(by.xpath("//div[@class='actions-row']//a[.='Make Payment']")).click();
browser.driver.sleep(2000);
element(by.name("amount")).sendKeys("5");
// element(by.model("payou_request.payou.amount")).sendKeys("5");
element(by.name("pay_for")).sendKeys("Mister Bungee");
element(by.name("notes")).sendKeys("Please approve my payments. Thanks a lot, Dr. Kugler. +972545453435");
element(by.name("email")).sendKeys("idanvcita@gmail.com");
element(by.name("first_name")).click();
browser.driver.sleep(5000);
element(by.css("button.btn.ng-binding")).click();
});
it('paypal', function() {
browser.ignoreSynchronization = false;
browser.driver.getAllWindowHandles().then(function (handles) {
browser.driver.switchTo().window(handles[1]);
});
element(by.id("pay_button")).click();
browser.driver.sleep(10000);
// it('Client LiveSite - Payments - PayPal Lightbox', function() {
// handlePromise.then(function (handles) {
// var popUpHandle = handles[1];
// var handle = driver.switchTo().window(popUpHandle).getWindowHandle();
// expect (handle).toEqual(popUpHandle);
// });
//expect (element(by.text("Your payment summary")).isPresent()).toBe(true);
element(by.id("loadLogin")).click();
browser.driver.sleep(1000);
element(by.id("login_email")).sendKeys("email");
element(by.id("login_password")).sendKeys("pass");
element(by.id("submitLogin")).click();
element(by.id("login_password")).click();
element(by.id("submit.x")).click();
});
});
来自 Node.JS 的错误:
The error from Node.JS:
UnknownError: null value in entry: name=null at new bot.Error (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesselenium-webdriverlibatomserror.js:113:18) at Object.bot.response.checkResponse (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesselenium-webdriverlibatoms
esponse.js:106:9) at C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesselenium-webdriverlibwebdriverwebdriver.js:377:20 at [object Object].promise.ControlFlow.runInFrame_ (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesselenium-webdriverlibwebdriverpromise.js:1877:20) at [object Object].promise.Callback_.goog.defineClass.notify (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesselenium-webdriverlibwebdriverpromise.js:2464:25) at [object Object].promise.Promise.notify_ (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesselenium-webdriverlibwebdriverpromise.js:563:12) at Array.forEach (native) at Object.goog.array.forEach (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesselenium-webdriverlibgoogarrayarray.js:203:43) at [object Object].promise.Promise.notifyAll_ (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesselenium-webdriverlibwebdriverpromise.js:552:16) at goog.async.run.processWorkQueue (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesselenium-webdriverlibgoogasync
un.js:125:21) From: Task: Asynchronous test function: it() at [object Object]. (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesjasminewdindex.js:93:33) at [object Object]. (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesminijasminenodelibasync-callback.js:45:37) at [object Object].jasmine.Block.execute (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesminijasminenodelibjasmine-1.3.1.js:1174:17) at [object Object].jasmine.Queue.next_ (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesminijasminenodelibjasmine-1.3.1.js:2209:31) at [object Object].jasmine.Queue.start (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesminijasminenodelibjasmine-1.3.1.js:2162:8) at [object Object].jasmine.Spec.execute (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesminijasminenodelibjasmine-1.3.1.js:2503:14) at [object Object].jasmine.Queue.next_ (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesminijasminenodelibjasmine-1.3.1.js:2209:31) at onComplete (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesminijasminenodelibjasmine-1.3.1.js:2205:18) at [object Object].jasmine.Spec.finish (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesminijasminenodelibjasmine-1.3.1.js:2477:5) at [object Object].onComplete (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesminijasminenodelibjasmine-1.3.1.js:2504:10)==== async task ==== Error at [object Object]. (c:automation estspayments.js:44:3) at [object Object].jasmine.Env.describe_ (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesminijasminenodelibjasmine-1.3.1.js:913:21) at [object Object].jasmine.Env.describe (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesminijasminenodelibjasmine-1.3.1.js:898:15) at describe (C:UsersidanAppDataRoaming
pm
ode_modulesprotractor
ode_modulesminijasminenodelibjasmine-1.3.1.js:658:27) at Object. (c:automation estspayments.js:2:1) at Module._compile (module.js:460:26) at Object.Module._extensions..js (module.js:478:10) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12)
这是相关的css代码:
This is the relevant css code:
<title>Pay with a PayPal account - PayPal</title><meta name="description" content="PayPal is the safer, easier way to pay online without revealing your credit card number."><meta http-equiv="X-UA-Compatible" content="IE=9"><link media="screen" rel="stylesheet" type="text/css" href="https://www.paypalobjects.com/WEBSCR-640-20150318-1/css/core/global.css"><link rel="stylesheet" type="text/css" href="https://www.paypalobjects.com/WEBSCR-640-20150318-1/Merchant/css/AP/checkout.css">
UnknownError: null value in entry: name=null
UnknownError: null value in entry: name=null
此错误表示您正试图切换到具有 undefined 名称或句柄的窗口.也就是说,此时窗口没有打开.
This error means you are trying to switch to a window with undefined name or handle. In other words, the window is not opened at the moment.
此外,您提供的代码存在多个问题:
Also, there are multiple issues with the code you've presented:
it 块组合成一个块,因为它们使用不同的浏览器窗口Continue和Continue to payment按钮getAllWindowHandles() 并继续在 then 功能块内工作sleep() 进行测试不可靠、缓慢且脆弱browser.driver,使用browser(你正在测试一个角度页面)ignoreSynchronization 设置为 true,在 afterEach()<中将其设置回 false/code> (点击后打开的非角度页面)it blocks into single one since they use different browser windowsContinue and Continue to payment buttons sequentuallygetAllWindowHandles() and continue working inside the then function blocksleep() that makes your test unreliable, slow and fragilebrowser.driver, use browser (you are testing an angular page)ignoreSynchronization to true before opening a new non-angular window, set it back to false in afterEach() (Non-angular page opened after a click)适合我的固定代码:
describe('payments', function () {
afterEach(function () {
browser.ignoreSynchronization = false;
});
it('Client LiveSite - Payments - Perform a payment', function () {
var EC = protractor.ExpectedConditions;
browser.get("https://www.vcita.com/v/bungee/home");
var makePayment = element(by.xpath("//div[@class='actions-row']//a[.='Make Payment']"));
browser.wait(EC.visibilityOf(makePayment), 5000);
makePayment.click();
var amount = element(by.name("amount"));
browser.wait(EC.visibilityOf(amount), 5000);
amount.sendKeys("5");
element(by.name("pay_for")).sendKeys("Mister Bungee");
element(by.name("notes")).sendKeys("Please approve my payments. Thanks a lot, Dr. Kugler. +972545453435");
element(by.name("email")).sendKeys("idanvcita@gmail.com");
element(by.name("first_name")).click();
browser.sleep(5000);
// Click "Continue"
element(by.xpath("//button[. = 'Continue']")).click();
// Click "Continue to Payment"
element(by.xpath("//button[. = 'Continue to Payment']")).click();
browser.ignoreSynchronization = true;
browser.getAllWindowHandles().then(function (handles) {
browser.switchTo().window(handles[1]);
var loadLogin = element(by.id("loadLogin"));
browser.wait(EC.visibilityOf(loadLogin), 15000);
loadLogin.click();
// TODO: continue with payment
});
});
});
<小时>
初步答案:
Initial answer:
括号未正确分组.替换:
The parenthesis are not grouped correctly. Replace:
expect (element(by.text("Your payment summary"))).isPresent().toBe(true);
在isPresent()之后加上(注意结束的)):
with (note the closing ) after isPresent()):
expect (element(by.text("Your payment summary")).isPresent()).toBe(true);
另外,你有一个额外的 findElement 调用,没有参数,你需要删除它:
Also, you have an extra findElement call with no arguments, which you need to remove:
browser.driver.findElement();
这篇关于Webdriver JS测试期间无法切换窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
在 javascript 认为文档“准备好"之前,如何让How can I get my jasmine tests fixtures to load before the javascript considers the document to be quot;readyquot;?(在 javascript 认为文档“准备好
jasmine 运行和等待实际上是做什么的?What do jasmine runs and waitsFor actually do?(jasmine 运行和等待实际上是做什么的?)
如何提供模拟文件来更改 <input type='filHow to provide mock files to change event of lt;input type=#39;file#39;gt; for unit testing(如何提供模拟文件来更改 lt;input type=filegt; 的事
如何使用 Jasmine 对链式方法进行单元测试How to unit test a chained method using Jasmine(如何使用 Jasmine 对链式方法进行单元测试)
如何将 $rootScope 注入 AngularJS 单元测试?How do I inject $rootScope into an AngularJS unit test?(如何将 $rootScope 注入 AngularJS 单元测试?)
Jasmine - 如何监视函数中的函数调用?Jasmine - How to spy on a function call within a function?(Jasmine - 如何监视函数中的函数调用?)