我正在尝试抓取元素内部文本并将内部文本写入文件但是我没有成功。程序运行并写入csv文件,但只是写出全局变量等于而不是元素的内部文本,这就是我所做的:
使用全局变量配置文件:
it('获取CycleStatus,Paydate,Weeknumber,Clientid - completed',function(){
//https://stackoverflow.com/questions/44362880/protractor-if-else-with-expectcondition
var cycle = $('#cycleStatusID');
browser.wait(EC.elementToBeClickable(cycle), 20000).then(function() {
cycle.getText().then(function(text){
if (['Cycle Complete',
'Entering Payroll Information',
'Correcting Input',
'UnderReview'].indexOf(text) >= 0) {
cycleStatus= text;
console.log(cycleStatus+ ' - Displayed');
} else {
cycleStatus= 'Cycle unknown';
console.log(cycleStatus);
}
});
});
var fs = require('fs');
fs.appendFile('/Users/hoflerj/Desktop/Protractor/WFN/psreport.csv',cycleStatus, function (err) {
if (err) throw err;
console.log('write complete!');
});
});//spec function
似乎是在它实际存储信息之前写入它应该是输入工资单信息然后说写完成。
问题是写入文件但将其放在所有一列中。
const fs = require('fs');
const cycle = $('#cycleStatusID'); // cycle status
const client = $('#clientID'); // clientid
const writeValueToFile = (value) => {
return fs.appendFile('/Users/hoflerj/Desktop/Protractor/WFN/psreport.csv', value + ";" + "hellow world", function (err) {
if (err) throw err;
console.log('write complete!');
});
}
答案 0 :(得分:1)
所以我认为你误解了承诺和变量范围是如何工作的。
const fs = require('fs');
const cycle = $('#cycleStatusID');
const writeValueToFile = (value) => {
return fs.appendFile('/Users/hoflerj/Desktop/Protractor/WFN/psreport.csv', value, function (err) {
if (err) throw err;
console.log('write complete!');
});
}
const acceptableValues = ['Cycle Complete', 'Entering Payroll Information', 'Correcting Input', 'UnderReview'];
// Cleaned your code up
browser.wait(EC.elementToBeClickable(cycle), 20000)
.then(() => {
const cycleStatus;
cycle.getText()
.then((text) => {
if (acceptableValues.indexOf(text) >= 0) {
cycleStatus = text;
console.log(cycleStatus+ ' - Displayed');
} else {
cycleStatus = 'Cycle unknown';
console.log(cycleStatus);
}
})
.then(() => {
writeValueToFile(cycleStatus);
});
});
//Here it is cleaner but could be confusing for you since you don't fully understand promises yet.
browser.wait(EC.elementToBeClickable(cycle), 20000)
.then(() => {
return cycle.getText()
.then((text) => {
if (acceptableValues.indexOf(text) >= 0) {
return text;
} else {
return 'Cycle unknown';
}
})
.then(writeValueToFile);
});
编辑: 承诺:代码最初编写的方式,你的代码叫做browser.wait(),从不运行你的块中的任何代码,执行你的写函数,然后在then块中运行代码。这导致您的变量未定义。因为它是在写入函数运行后设置的。 这是我第一次尝试理解承诺时使用的一篇很棒的文章 https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html
你也可能有一个变量提升问题,但可能没有。我看到你在then块中设置了cycleStatus的变量,但从未看到你定义它的位置。当您到达正在写入文件的部分时,这可能导致全局变量或该变量未定义,因为该变量从未在当前范围中定义。 https://www.designingforscale.com/understanding-hoisting-in-javascript/
答案 1 :(得分:0)
你现在得到的原因"未定义"是你还在全球声明中拼错cycleStatus
。如果你解决了这个问题,那么你最终会回到你开始的地方。
如果您向控制台输出cycleStatus
而不是自定义消息,则可以更好地进行调试。您还在browser.wait
中使用了千位分隔符,删除它们可能会或可能不会解决问题。我认为你需要整理一下这样你才能看到你正在做的事情。
试试这个:
var cycle = $('#cycleStatusID');
browser.wait(EC.elementToBeClickable(cycle), 20000).then(function() {
cycle.getText().then(function(text){
if (['Cycle Complete',
'Entering Payroll Information',
'Correcting Input',
'UnderReview'].indexOf(text) >= 0) {
cycleStatus = text;
console.log(cycleStatus + ' - Displayed');
} else {
cycleStatus = 'Cycle unknown';
console.log(cycleStatus);
}
});
});
如果将它放在上下文中时不起作用,则可能必须使用承诺将cycleStatus
返回给csv writer。