Selenium переход на следующую страницу до последней страницы - PullRequest
0 голосов
/ 29 июня 2018

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

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

while True:
  try :
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Next'))).click()
  except :
      print("No more pages left")
      break
driver.quit()

Я тоже попробовал это:

try:
    link = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,'.pagination-next a')))
    driver.execute_script('arguments[0].scrollIntoView();', link)
    link.click()
except:
    keep_going = False

Я пытался вставить операторы print, и он просто остается на последней странице.

Вот HTML-код для первой / последней страницы для следующей кнопки, я не уверен, что смог бы что-то сделать, используя это: HTML для первой страницы:

<li role="menuitem" ng-if="::directionLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-next" style=""><a href="" ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle="">Next</a></li>
    <a href="" ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle="">Next</a>
</li>

HTML для последней страницы:

<li role="menuitem" ng-if="::directionLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-next disabled" style=""><a href="" ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle="" disabled="disabled" tabindex="-1">Next</a></li>
    <a href="" ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle="" disabled="disabled" tabindex="-1">Next</a>
</li>

Ответы [ 4 ]

0 голосов
/ 29 июня 2018

next_page_btn.index (0) .click () не работал, но проверка len of next_page_btn работала, чтобы определить, была ли это последняя страница, поэтому я смог это сделать.

while True:
    next_page_btn = driver.find_elements_by_xpath("//li[@class = 'pagination-next']/a")
    if len(next_page_btn) < 1:
        print("No more pages left")
        break
    else:
        WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Next'))).click()

Большое спасибо за помощь!

0 голосов
/ 29 июня 2018

xPath для кнопки:

//li[@class = 'pagination-next']/a

, поэтому каждый раз, когда вам нужно загрузить следующую страницу, вы можете нажать на этот элемент:

next_page_btn = driver.find_elements_by_xpath("//li[@class = 'pagination-next']/a")
next_page_btn.index(0).click()

Примечание: вы должны добавить логику:

while True:
    next_page_btn = driver.find_elements_by_xpath("//li[@class = 'pagination-next']/a")
    if len(next_page_btn) < 1:
        print("No more pages left")
        break
    else:
        # do stuff
0 голосов
/ 29 июня 2018

Вы можете решить проблему, как показано ниже,

Кнопка «Далее» будет доступна до последней страницы и будет отключена на последней странице.

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

Я не знаком с синтаксисом Python. Итак, вы можете преобразовать приведенный ниже код Java, а затем использовать его. Это будет работать наверняка.

Код:

    boolean hasNextPage=true;

    while(hasNextPage){
        List<WebElement> enabled_next_page_btn=driver.findElements(By.xpath("//li[@class='pagination-next']/a"));
        List<WebElement> disabled_next_page_btn=driver.findElements(By.xpath("//li[@class='pagination-next disabled']/a"));

        //If the Next button is enabled/available, then enabled_next_page_btn size will be one.
        // So,you can perform the click action and then do the action
        if(enabled_next_page_btn.size()>0){
            enabled_next_page_btn.get(0).click();
            hasNextPage=true;
        }else if(disabled_next_page_btn.size()>0){
            System.out.println("No more Pages Available");
            break;
        }
    }
0 голосов
/ 29 июня 2018

Как насчет использования цикла do / while и просто проверить, включен ли класс «disabled» в атрибуты следующей кнопки для выхода? (Извините за синтаксис. Я просто скомбинировал это и не пробовал)

string classAttribute

try :

     do
     {
          IWebElement element = driver.findElement(By.LINK_TEXT("Next"))
          classAttribute = element.GetAttribute("class")
          element.click()
     }
     while(!classAttribute.contains("disabled"))

except :

     pass

driver.quit()
...