Транспортир получает ссылку на устаревший элемент в объекте страницы - PullRequest
0 голосов
/ 25 апреля 2018

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

filterButton.click().then(function () {
  filteroptions.count().then(function (totalradios) {
    console.log("before start" + totalradios);
    filteroptions.each(function (radiooption, index) {
      radiooption.getText()  //getting error at this place on the second iteration
       .then(function (radioName) {
        console.log(radioName, index);
      })
      radiooption.click().then(() => {
        filterSubmit.click().then(function () {
          console.log(totalradios, ' ', index)
          if (index <= totalradios) {
            filterButton.click();
          }
        })
      })
    })
  })
})

Обновлен из каждой (функции) в цикл For

 var filteroptions = element.all(by.css("md-radio-group.ng-pristine.ng-untouched.ng-valid._md.layout-row.ng-not-empty md-radio-button")); 

filterButton.click().then(function () {
  filteroptions.count().then(function (totalradios, async) {
   console.log("before start" + totalradios);
   for (var i = 0; i < totalradios; i++) {
   console.log("recalulated true " + totalradios);
   (function (index) {
    console.log("select filter option");
    filteroptions.get(index).click();
    console.log("click submit button");
    filterSubmit.click();
    console.log("click filter button");
    filterButton.click();
    console.log("get new totalcounts");
    let setradios = filteroptions.count().then((value) => {
    return value;
   })
   console.log("recalulated totalradios" + setradios);
   totalradios = setradios;
   })(i);
  }
  })
})

Пытался прочитать список в отдельной функции

var getfiltercount = function () {
  filteroptions = element.all(by.css("md-radio-group.ng-pristine.ng-untouched.ng-valid._md.layout-row.ng-not-empty md-radio-button")); // filtertext
  return filteroptions.count().then(function (addradios) {
  console.log("addradios is " + addradios);
 })
  return addradios;
}

1 Ответ

0 голосов
/ 25 апреля 2018

Поскольку селен также будет обрабатывать следующую ситуацию при входе на новую страницу:

  • Обновление страницы в целом, даже URL-адрес страницы не изменяется
  • Частичное обновление страницы, даже URL-адрес страницы не изменяется

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

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

// функция для проверки при выборе yes переключатель

function testYesRaidoButton() {
    // click `yes` radio button
    element(<locator of `yes` raido button>).click();
    // find how many new radio buttons will appear after choose `yes`
    element.all(<locator of sub radio buttons of `yes`>).count()

    .then(function (totalradios) {
        console.log("before start " + totalradios);

        for(var i=0;i<totalradios;i++) {

            (function(index) {

                // click one of new radio button of `yes`
                element.all(<locator of sub radio buttons of `yes`>).get(index).click();

                // click `submit` button
                element(<locator of filterSubmit>).click();

                // click `yes` radio button on `new page` again
                element(<locator of `yes` raido button>).click();

            })(i);

        }
    });
}

// функция дляпроверка при выборе радиокнопки no

function testNoRadioButton() {
    // click `no` radio button
    element(<locator of `no` raido button>).click();
    // find how many new radio buttons will appear after choose `no`
    element.all(<locator of sub radio buttons of `yes`>).count()

    .then(function (totalradios) {
        console.log("before start " + totalradios);

        for(var i=0;i<totalradios;i++) {

            (function(index) {

                // click one of new radio button of `no`
                element.all(<locator of sub radio buttons of `no`>).get(index).click();

                // click `submit` button
                element(<locator of filterSubmit>).click();

                // click `no` radio button on `new page` again
                element(<locator of `no` raido button>).click();

            })(i);

        }
    }); 
}

На самом деле две функции имеют много одинаковых строк кода, вы можете оптимизировать их и объединить в одну функцию, чтобы принимать разные значения параметров для архивирования одной и той же цели.

Альтернативное решение для архивирования какой-либо цели с использованием двух циклов, но не рекомендуется делать так, потому что код трудно читать и понимать,довольно не дружелюбный.

// iterate `yes` and 'no'
for (var j = 0; j < 2; j++) {

  (function(__index) {

    element.all(<locator of `yes` and `no` radio button>).get(__index).click();

    element.all(<locator of new radio buttons>).count()

    .then(function(totalradios) {
      console.log("before start " + totalradios);

      // iterate new radio buttons
      for (var i = 0; i < totalradios; i++) {

        (function(index) {

          // click one of new radio buttons
          element.all(<locator of new radio buttons>).get(index).click();

          // click `submit` button
          element(<locator of filterSubmit> ).click();

          // click `yes` or `no` radio button on `new page` again
          element.all(<locator of `yes` and `no` radio button>).get(__index).click();

        })(i);

      }
    });

  })(j)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...