我正在研究Protractor以测试Angular JS应用程序。我已经编写了一个代码来从excel表中读取数据。我的情况就像我有一个应该执行的端到端流程。代码将从excel表中获取URL,UserName和Password,并将执行整个流程。再次,它将迭代另一个值。但它不会进入循环。
我的代码是:
var Excel = require('exceljs');
var XLSX = require('xlsx');
var os = require('os');
var TEMP_DIR = os.tmpdir();
var wrkbook = new Excel.Workbook();
//---------------------Duration as Days------------------------------------------
describe('Open the clinicare website by logging into the site', function () {
it('IP Medication Simple flows for Patient Keerthi for Days,Weeks and Months', function () {
console.log("hello6");
browser.driver.manage().window().maximize();
var wb = XLSX.readFile('E:\\LAM WAH EE_Testing Enviornment\\IP_Medication_Flow\\Patients_Entry.xlsx');
var ws = wb.Sheets.Sheet1;
var json = XLSX.utils.sheet_to_json(wb.Sheets.Sheet1);
console.log("json", json);
//var json = XLSX.utils.sheet_to_json(wb.Sheets.Sheet1);
//console.log("json", json);
for(var a = 0; a < json.length ; a++){
console.log("Test_URL", json[a].Test_URL);
console.log("User_Name", json[a].User_Name);
console.log("Password", json[a].Password);
browser.get(json[a].Test_URL);
console.log("hello10");
//Perform Login:UserName
element(by.model('accessCode')).sendKeys(json[a].User_Name);
browser.sleep(6000);
// browser.driver.sleep(6000);
//Perform Login:Password
element(by.model('password')).sendKeys(json[a].Password);
browser.sleep(6000);
//Hospital Name
element(by.cssContainingText('option', 'HLWE')).click();
browser.sleep(6000);
//Perform Login:LoginButton
element(by.css('.btn.btn-primary.pull-right')).click();
browser.sleep(6000);
//Clicking on Admitted Tab
element(by.xpath("//span[contains(text(),' Admitted(25)')]")).click();
browser.sleep(6000);
// browser.driver.sleep(6000);
//Clicking on First Admitted Patient
element(by.cssContainingText('span.clearfloat', '35690')).element(by.xpath('//*[@id="searchPatientImgAdmittedF"]')).click();
jasmine.DEFAULT_TIMEOUT_INTERVAL = 600000;
// browser.sleep(600);
//Clicking anywhere to proceed
element(by.xpath('/html/body/div[3]/div[1]/div[16]/div[1]/div/table[4]/tbody/tr[2]/td/div/div/div[3]/table/tbody/tr[1]/td[3]')).click();
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
browser.sleep(800);
感谢任何人的帮助。提前谢谢。
答案 0 :(得分:0)
这是因为Protractor API执行Async,但 for(var a = 0; a < json.length ; a++) {
(function(a){
console.log("Test_URL", json[a].Test_URL);
console.log("User_Name", json[a].User_Name);
console.log("Password", json[a].Password);
browser.get(json[a].Test_URL);
console.log("hello10");
//Perform Login:UserName
element(by.model('accessCode')).sendKeys(json[a].User_Name);
browser.sleep(6000);
// browser.driver.sleep(6000);
//Perform Login:Password
element(by.model('password')).sendKeys(json[a].Password);
browser.sleep(6000);
...
})(a)
}
循环执行Sync。从here获取详细解释,这与您的问题相同。
要解决您的问题,我们可以使用javascript闭包。
class Car {
private name : string;
private velocity: number;
constructor (name: string) {
this.name = name;
this.velocity = 0;
}
private speedUp = (incrementer: number): void => {
console.log(this);
this.velocity += incrementer;
}
public pressAccelerator = (power: number): void => {
console.log(this); //here this is a Car object
setTimeout(() => this.speedUp(power*1.34), 1000);
}
public getVelocity = (): number => {
return this.velocity;
}
}
let myCar = new Car("Mercedes");
myCar.pressAccelerator(2);
console.log(myCar.getVelocity());
答案 1 :(得分:0)
好吧最初与'exceljs'
节点模块混淆了。它不用于您的测试。我认为这里的主要问题是该文件不存在。
readFile
的第一件事是readFileSync
的别名,它调用readSync
调用(可能)read_binary
,它会卸载到节点{{3} }}。很可能fs.readFileSync
抛出了ENOENT,因为路径不存在。
查看您的路径,您可能需要在空格之前使用反斜杠。
var wb = XLSX.readFile('E:\\LAM\ WAH\ EE_Testing Enviornment\\IP_Medication_Flow\\Patients_Entry.xlsx');
在调用读取文件方法之前,使用path.resolve
获取文件路径可能是个好习惯。
var path = require('path');
var patientEntryFilePath = path.resolve('E:\\LAM\ WAH\ EE_Testing Enviornment\\IP_Medication_Flow\\Patients_Entry.xlsx');
console.log(patientEntryFilePath);
var wb = XLSX.readFile(patientEntryFilePath);
有关原始问题的代码段的一些其他评论。也许是未来清理的考虑因素。
考虑使用beforeAll
或beforeEach
来设置浏览器驱动程序窗口大小和读取文件。在文件中读取一次可能节省时间和资源。
describe('Open the clinicare website by logging into the site', function () {
var json = null;
beforeAll(() => {
browser.driver.manage().window().maximize();
var wb = XLSX.readFile('E:\\LAM\ WAH\ EE_Testing Enviornment\\IP_Medication_Flow\\Patients_Entry.xlsx');
var ws = wb.Sheets.Sheet1;
json = XLSX.utils.sheet_to_json(wb.Sheets.Sheet1);
});
it('IP Medication Simple flows for Patient Keerthi for Days,Weeks and Months', function () {
console.log("json", json);
...
看一下你的测试,它是一个登录,它似乎有相同的流程,你真的只需要测试一次。 for循环是可以接受的,因为解析了json文件并且每个行都在Protractor使用的控制流中执行。
避免使用xpath。最好通过css或id或部分路径查找元素。在开发人员中,在div列表中添加一个额外的div会破坏您的测试,使您的测试更加脆弱并需要更多的维护。