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

现在一切正常。