我正在将量角器-黄瓜框架与量角器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的值。我该如何解决呢?
答案 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());