Javascript код для выполнения кликов по Id и Xpath выполняется так быстро - PullRequest
1 голос
/ 24 мая 2019

Я очень новичок в Javascript. Я пытаюсь установить код JavaScript в Selenium IDE с помощью команды «execute Script», чтобы открыть кнопку настроек с одинаковым class = «MyClass» (всего 16 кнопок).

После нажатия на кнопку появляется окно с некоторыми опциями. Когда эти параметры видны, я хочу выбрать параметр, который может быть найден Xpath, и, наконец, я хочу сохранить настройки для каждой кнопки, а затем повторить то же самое для 16 кнопок.

Код, который у меня есть, кажется, работает частично, потому что находит кнопку 16, и я могу сделать цикл for и щелкнуть по ним, но кажется, что он работает так быстро и это приводит к тому, что другие действия не будут завершены.

var items = document.getElementsByClassName("MyClass"); 
for (var i = 0; i < items.length; i++) {
    items[i].click(); // To open each button that have the class = "MyClass"
    document.evaluate(" //li[contains(.,'sometext')] ", document.body, null, 9, null). singleNodeValue.click(); // Click on elemenet by Xpath
    document.getElementById("savesettings").click(); // Save settings
};

Как мне добавить паузу, например, такую?

var items = document.getElementsByClassName("MyClass"); 
for (var i = 0; i < items.length; i++) {
    items[i].click(); // To open each button that have the class = "MyClass"

    **Command to wait 2 seconds**

    document.evaluate(" //li[contains(.,'sometext')] ", document.body, null, 9, null). singleNodeValue.click(); // Click on elemenet by Xpath

    **Command to wait 2 seconds**

    document.getElementById("savesettings").click(); 
};

Заранее спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Я не совсем уверен, что вы пытаетесь сделать здесь, но вы можете отложить выполнение, используя функцию window.setTimeout .Это вызовет функцию по истечении заданного промежутка времени.

Внутри этой функции вы можете решить, что делать - инициировать другой тайм-аут или выполнить что-то прямо сейчас - с помощью простого блока переключателей.

var items = document.getElementsByClassName("MyClass");
var currentItem = 0;
var currentAction = 0;

function update() {
  switch (currentAction) {
    case 0:
      items[currentItem].click();
      currentAction = 1;
      window.setTimeout(update, 2000);
      break;
    case 1:
      document.evaluate(" //li[contains(.,'sometext')] ", document.body, null, 9, null).singleNodeValue.click(); // Click on elemenet by Xpath
      currentAction = 2;
      window.setTimeout(update, 2000);
      break;
    case 2:
      document.getElementById("savesettings").click();
      currentAction = 0;
      if (currentItem + 1 < items.length) {
        currentItem++;
        update();
      }
      break;
  }
}

update();
0 голосов
/ 24 мая 2019

Похоже, вы должны использовать Обещания: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Здесь есть ответ: Обещание JavaScript ES6 для цикла

Вы можете взять пример и реализоватьэто внутри вашего кода:

for (let i = 0, p = Promise.resolve(); i < 10; i++) {
    p = p.then(_ => new Promise(resolve =>
        setTimeout(function () {
            console.log(i);
            resolve();
        }, Math.random() * 1000)
    ));
}
...