Protractor 元素在量角器中的for循环内不可单击
我将量角器框架与量角器5.2.2和mssql 3.3.0一起使用。我们有获取db值的要求,我能够将db数据值获取到量角器代码中,但我无法单击具有该db值的元素。我的代码如下所示Protractor 元素在量角器中的for循环内不可单击,protractor,Protractor,我将量角器框架与量角器5.2.2和mssql 3.3.0一起使用。我们有获取db值的要求,我能够将db数据值获取到量角器代码中,但我无法单击具有该db值的元素。我的代码如下所示 function ConnectDB() { var config = { user: 'sam', password: 'Passw0rd', server: 'xxxxxx', port: '50866', database: 'testDB', options:
function ConnectDB() {
var config = {
user: 'sam',
password: 'Passw0rd',
server: 'xxxxxx',
port: '50866',
database: 'testDB',
options: {
trustedConnection: true
}
}
sql.connect(config, function (err) {
if (err) console.log(err+" db connection failed");
var request = new sql.Request();
request.query('SELECT * FROM Locations WHERE ID = 2', function (err, loc){
if (err) console.log(err+" loc_name failed");
var loc_count= loc.length;
console.log(loc_count);
console.log(loc[0].Location_name);
var i;
for (i=0; i<loc_count; i++){
if(loc_count!=0 & loc_count%10==0){
element(by.css(.publish)).click();
}
element(by.cssContainingText("span", loc[i].Location_name)).click();
console.log(loc[i].Location_name);
browser.sleep(4000);
element(by.css(.post)).sendKeys("test");
element(by.css(.submit)).click();
}
});
});
}
函数ConnectDB(){
变量配置={
用户:“sam”,
密码:“Passw0rd”,
服务器:“xxxxxx”,
端口:“50866”,
数据库:“testDB”,
选项:{
信任连接:true
}
}
sql.connect(配置,函数(错误){
if(err)console.log(err+“db连接失败”);
var request=new sql.request();
query('SELECT*来自ID=2的位置',函数(err,loc){
if(err)console.log(err+“loc_name failed”);
var loc_计数=loc.长度;
控制台日志(loc_计数);
console.log(loc[0]。位置\名称);
var i;
对于(i=0;i问题的根本原因是循环体的脚本几乎是异步执行的。所有量角器API都是异步的。因此,循环中的发送键单击()
,睡眠()
是异步执行的。但是循环迭代同步
这导致当i==loc\u count
时,i==0
的click()/sendKeys()/sleep()
未执行(它们是异步的)
一种解决方案是使用Closure
为每次迭代保留i
。另一种解决方案是使用ES6async/await
下面是解决方案1的代码示例:
var i;
for (i=0; i<loc_count; i++){
(function(j){
if(loc_count!=0 && loc_count%10==0){
element(by.css('.publish')).click();
}
element(by.cssContainingText("span", loc[j].Location_name)).click();
console.log(loc[j].Location_name);
browser.sleep(4000);
element(by.css('.post')).sendKeys("test");
element(by.css('.submit')).click();
})(i)
}
vari;
for(i=0;i正如yong所说,这是因为for循环是同步的,而量角器操作是异步的。您需要实现async/await或使用then
回调使其正常工作
异步/等待选项:
request.query('SELECT * FROM Locations WHERE ID = 2', async function (err, loc){
if (err) console.log(err+" loc_name failed");
var loc_count= loc.length;
console.log(loc_count);
console.log(loc[0].Location_name);
var i;
for (i=0; i<loc_count; i++){
if(loc_count!=0 & loc_count%10==0){
await element(by.css(.publish)).click();
}
await element(by.cssContainingText("span", loc[i].Location_name)).click();
console.log(loc[i].Location_name);
await browser.sleep(4000);
await element(by.css(.post)).sendKeys("test");
await element(by.css(.submit)).click();
}
第一个选项更易于阅读和正确实施。尝试使用:-
var elm=元素(by.id(“myid”)
browser.executeScript(“参数[0]。单击();”,elm.getWebElement()谢谢您的回复。我已经尝试了上面的代码。但是如果等待时间较短,它不会执行完整长度的for循环,而是在执行for循环一次后进入下一个功能步骤。但是我们不能硬编码等待时间,因为我们不知道for循环的长度。那么我如何等待它完全执行for循环呢然后,只有它才能进入下一个功能步骤。
element(by.cssContainingText("span", loc[i].Location_name)).click().then(() -> {
console.log(loc[i].Location_name);
browser.sleep(4000).then(() => {
element(by.css(.post)).sendKeys("test").then(() => {
element(by.css(.submit)).click();
});
});
});