устаревший элемент в Селен Python 3.6

1

Мой код:

count = 1
next_page_string = "javascript:__doPostBack('ctl00$MainContent$grdResults','Page$" + str(count) + "')"
td_page_number_list = driver.find_elements_by_xpath("//*[@id='MainContent_grdResults']/tbody/tr[22]/td/table/tbody/tr/td/a")
for x in td_page_number_list:
      if x.get_attribute("href") == next_page_string:
                driver.execute_script("__doPostBack('ctl00$MainContent$grdResults','Page$" + str(count) + "')")

Код прерывается, когда driver object переходит к execute_script после выполнения условия, давая мне ошибку:

stale element reference: element is not attached to the page document

Похоже, что это имеет какое-то отношение к используемому циклу for. Я попробовал неявное ожидание без везения.

Заранее спасибо.

Теги:
python-3.x
selenium
selenium-webdriver
selenium-chromedriver

2 ответа

0

Мне понадобился простой break сразу после driver.execute_script(). Фактически он выполнял __doPostBack, но цикл for все еще выполнялся после выполнения условия if. Все, что мне нужно было сделать, это выйти из цикла после выполнения условия, чего вы можете достичь, используя условие break.

0

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

Чтобы устранить проблему, простой способ - снова найти номера страниц на новой странице в каждой итерации цикла.

count = 1
next_page_string = "javascript:__doPostBack('ctl00$MainContent$grdResults','Page$" 
                  + str(count) + "')"
td_page_number_list = driver.find_elements_by_xpath(
   "//*[@id='MainContent_grdResults']/tbody/tr[22]/td/table/tbody/tr/td/a")

for x in td_page_number_list:
  if x.get_attribute("href") == next_page_string:
    driver.execute_script("__doPostBack('ctl00$MainContent$grdResults','Page$" 
                  + str(count) + "')")

    // find page numbers on new page again after click
    // i think you need to add some wait before find again 
    // like: time.sleep(5) or using selenium wait api
    td_page_number_list = driver.find_elements_by_xpath(
           "//*[@id='MainContent_grdResults']/tbody/tr[22]/td/table/tbody/tr/td/a")

Ещё вопросы

Сообщество Overcoder
Наверх
Меню