Nightwatch.js - 在另一个函数中使用供以后使用的变量将不起作用
Nightwatch.js - Using variables for later use inside another function won't work
我已经研究过这个问题,但找不到合适的解决方案。这是我正在尝试做的事情(我正在使用 nightwatch v0.9.8 和 "selenium-server-standalone-3.0.0-beta3"):
var servico, dataCriado, a, selector;
module.exports = {
'test case': function(client) {
client
*** do login stuff ***
*** go to a page and then execute this: ***
.execute (function (){
// Get all <a/> tags inside 'listaEtapasServicos':
var estados = document.getElementsByClassName('listaEtapasServicos')[0].getElementsByTagName("a");
// Get all divs inside with the class 'grid-cons-medium' inside 'listaEtapasServicos'
var div = document.getElementsByClassName('listaEtapasServicos')[0].getElementsByClassName('grid-cons-medium');
// What I'm trying to do here is to look for an element containing the text "Suspender" inside a table, save the info inside this specific table line ('Serviço' and 'Data criado') and then click on "Suspender":
for (var i = 0; i < estados.length; i++){
if (estados[i].innerHTML == "Suspender") {
a = i+1;
servico = div[i].getElementsByTagName('span')[0].innerHTML;
dataCriado = div[i].getElementsByTagName('span')[1].innerHTML;
selector = "#div-container > div:nth-child(4) > div > div > div > div:nth-child(2) > div.div-group-info-medium > div > div > div.listaEtapasServicos.scroll-pane-pattern.scroll-pane-medium.ps-container.ps-active-y > div:nth-child("+ a +") > div.grid-padroes-geral.grid-col-100.text-left > a";
break;
}
}
}, [])
// Where the error happens:
.perform(function () {
client.click(selector);
})
*** Test failed ***
错误:无法定位元素:"undefined" 使用:css 选择器
table的图像:
Table
事情是 nightwatch 告诉我变量 'selector' 未定义,即使我在点击函数之前使用命令 'alert(selector)' 编写另一个执行程序,警报也会 return 正是我想要的选择器。像这样的问题已经分配在这里:https://groups.google.com/forum/#!topic/nightwatchjs/AzRC-Sbgt4Q
但是给定的解决方案对我不起作用。只做 '.click(selector)' 也行不通。有人可以帮我找到解决方案吗?
更新:
好的,刚刚在这里找到了解决方法:
那么代码将如下所示:
for (var i = 0; i < estados.length; i++){
if (estados[i].innerHTML == "Suspender") {
a = i+1;
servico = div[i].getElementsByTagName('span')[0].innerHTML;
dataCriado = div[i].getElementsByTagName('span')[1].innerHTML;
selector = "#div-container > div:nth-child(4) > div > div > div > div:nth-child(2) > div.div-group-info-medium > div > div > div.listaEtapasServicos.scroll-pane-pattern.scroll-pane-medium.ps-container.ps-active-y > div:nth-child("+ a +") > div.grid-padroes-geral.grid-col-100.text-left > a";
client.click(selector);
break;
}
}
}, [])
成功了。但我的问题是我仍然需要这些变量供以后使用,但 nightwatch 不会定义它们。如何让 nightwatch 定义我的变量,以便它们不会保持未定义状态?此外,为什么此警报会显示在第一个执行程序中定义的选择器:
.execute [...] (first executor)
.execute(function (){ alert (selector) })
...但是“.perform()”函数中的点击不起作用?
找到解决方案!
我的问题是我不知道 .execute()
函数的实际工作原理。它的范围仅限于 document 对象,所以如果我希望我的变量保留我希望它们拥有的值,我必须通过 callback
函数来实现。
此外,client
对象和它的步骤都是在.execute()
函数执行之前实例化的,此时selector
值仍然是未定义的。这就是为什么需要 perform()
函数的原因。代码保持这样:
.execute(function () {
var estados = document.getElementsByClassName('listaEtapasServicos')[0].getElementsByTagName("a");
var div = document.getElementsByClassName('listaEtapasServicos')[0].getElementsByClassName("grid-cons-medium");
for (var i = 0; i < estados.length; i++) {
if (estados[i].innerHTML == "Suspender") {
a = i + 1;
servico = div[i].getElementsByTagName('span')[0].innerHTML;
dataCriado = div[i].getElementsByTagName('span')[1].innerHTML;
selector = "div.grid-cons-medium:nth-child("+a+") > div:nth-child(4) > a:nth-child(1)";
return [a, servico, dataCriado, selector];
}
}
}, [], function (result) {
a = result.value[0];
servico = result.value[1];
dataCriado = result.value[2];
selector = result.value[3];
})
.perform(function(){
client.waitForElementPresent(selector, 10000);
client.click(selector);
})
现在一切正常。
我已经研究过这个问题,但找不到合适的解决方案。这是我正在尝试做的事情(我正在使用 nightwatch v0.9.8 和 "selenium-server-standalone-3.0.0-beta3"):
var servico, dataCriado, a, selector;
module.exports = {
'test case': function(client) {
client
*** do login stuff ***
*** go to a page and then execute this: ***
.execute (function (){
// Get all <a/> tags inside 'listaEtapasServicos':
var estados = document.getElementsByClassName('listaEtapasServicos')[0].getElementsByTagName("a");
// Get all divs inside with the class 'grid-cons-medium' inside 'listaEtapasServicos'
var div = document.getElementsByClassName('listaEtapasServicos')[0].getElementsByClassName('grid-cons-medium');
// What I'm trying to do here is to look for an element containing the text "Suspender" inside a table, save the info inside this specific table line ('Serviço' and 'Data criado') and then click on "Suspender":
for (var i = 0; i < estados.length; i++){
if (estados[i].innerHTML == "Suspender") {
a = i+1;
servico = div[i].getElementsByTagName('span')[0].innerHTML;
dataCriado = div[i].getElementsByTagName('span')[1].innerHTML;
selector = "#div-container > div:nth-child(4) > div > div > div > div:nth-child(2) > div.div-group-info-medium > div > div > div.listaEtapasServicos.scroll-pane-pattern.scroll-pane-medium.ps-container.ps-active-y > div:nth-child("+ a +") > div.grid-padroes-geral.grid-col-100.text-left > a";
break;
}
}
}, [])
// Where the error happens:
.perform(function () {
client.click(selector);
})
*** Test failed ***
错误:无法定位元素:"undefined" 使用:css 选择器
table的图像:
Table
事情是 nightwatch 告诉我变量 'selector' 未定义,即使我在点击函数之前使用命令 'alert(selector)' 编写另一个执行程序,警报也会 return 正是我想要的选择器。像这样的问题已经分配在这里:https://groups.google.com/forum/#!topic/nightwatchjs/AzRC-Sbgt4Q
但是给定的解决方案对我不起作用。只做 '.click(selector)' 也行不通。有人可以帮我找到解决方案吗?
更新:
好的,刚刚在这里找到了解决方法:
那么代码将如下所示:
for (var i = 0; i < estados.length; i++){
if (estados[i].innerHTML == "Suspender") {
a = i+1;
servico = div[i].getElementsByTagName('span')[0].innerHTML;
dataCriado = div[i].getElementsByTagName('span')[1].innerHTML;
selector = "#div-container > div:nth-child(4) > div > div > div > div:nth-child(2) > div.div-group-info-medium > div > div > div.listaEtapasServicos.scroll-pane-pattern.scroll-pane-medium.ps-container.ps-active-y > div:nth-child("+ a +") > div.grid-padroes-geral.grid-col-100.text-left > a";
client.click(selector);
break;
}
}
}, [])
成功了。但我的问题是我仍然需要这些变量供以后使用,但 nightwatch 不会定义它们。如何让 nightwatch 定义我的变量,以便它们不会保持未定义状态?此外,为什么此警报会显示在第一个执行程序中定义的选择器:
.execute [...] (first executor)
.execute(function (){ alert (selector) })
...但是“.perform()”函数中的点击不起作用?
找到解决方案!
我的问题是我不知道 .execute()
函数的实际工作原理。它的范围仅限于 document 对象,所以如果我希望我的变量保留我希望它们拥有的值,我必须通过 callback
函数来实现。
此外,client
对象和它的步骤都是在.execute()
函数执行之前实例化的,此时selector
值仍然是未定义的。这就是为什么需要 perform()
函数的原因。代码保持这样:
.execute(function () {
var estados = document.getElementsByClassName('listaEtapasServicos')[0].getElementsByTagName("a");
var div = document.getElementsByClassName('listaEtapasServicos')[0].getElementsByClassName("grid-cons-medium");
for (var i = 0; i < estados.length; i++) {
if (estados[i].innerHTML == "Suspender") {
a = i + 1;
servico = div[i].getElementsByTagName('span')[0].innerHTML;
dataCriado = div[i].getElementsByTagName('span')[1].innerHTML;
selector = "div.grid-cons-medium:nth-child("+a+") > div:nth-child(4) > a:nth-child(1)";
return [a, servico, dataCriado, selector];
}
}
}, [], function (result) {
a = result.value[0];
servico = result.value[1];
dataCriado = result.value[2];
selector = result.value[3];
})
.perform(function(){
client.waitForElementPresent(selector, 10000);
client.click(selector);
})
现在一切正常。