量角器中的for循环内部无法单击元素

时间:2018-08-30 04:49:54

标签: 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: {
     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();
      }
   });
 });
}

在for循环中的click()和senkeys()函数不起作用。但是我能够控制loc_count和loc [i] .Location_name的值。我该如何解决呢?

3 个答案:

答案 0 :(得分:1)

问题的根本原因是循环主体的脚本几乎异步执行。所有量角器API都是异步的。因此,循环内的sendKeys click()sleep()是异步执行的。但是循环迭代同步。

这将导致i==loc_count的{​​{1}},click()/sendKeys()/sleep()未执行(它们是异步的)。

一种解决方案是使用i==0为每次迭代保留Closure。另一个解决方案是使用ES6 i

下面是解决方案一的代码示例:

async/await

答案 1 :(得分:0)

正如yong所说,这是因为您的for循环是同步的,而量角器的动作是异步的。您要么需要实现异步/等待,要么使用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();
  }

});

要使用then回调,正确处理if块会有些困难,但是从本质上讲,您需要执行类似的操作才能使其正常工作。

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();
        });
    });
});

第一个选项更容易阅读和正确实现。

答案 2 :(得分:0)

尝试使用:-

var elm = element(by.id(“ myid”));

browser.executeScript(“ arguments [0] .click();”,elm.getWebElement());