Protractor 元素在量角器中的for循环内不可单击

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:

我将量角器框架与量角器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: {
     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
。另一种解决方案是使用ES6
async/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();
        });
    });
});