Как нажать на элемент в списке без знака, используя Python Selenium - PullRequest
2 голосов
/ 03 июня 2019

У меня есть веб-страница с кнопками First, Prev, 1, 2, 3, 4, 5, Next, Last

Я хочу автоматически нажать «Next» (и другие), но не могу найтиправильный способ сделать это из списка без знака.

Я могу перейти к конкретному элементу в списке.Тем не менее, я не могу выполнить .click () для этого элемента без возврата ошибки.

Это раздел HTML-кода

<nav>
    <input type="hidden" id="page" name="page" value="2">
    <input type="hidden" id="resetPage" name="resetPage" value="">
    <input type="hidden" id="info_firstPage" value="/info#PCB">
    <ul id="info_pageclass" class="pageclass">
        <li class="disabled" style="pointer-events: none;"><a href="/info#PCB"><span>First</span></a></li>,
        <li class="disabled" style="pointer-events: none;"><a href="/info/page0#PCB" rel="prev"><span>Prev</span></a></li>,
        <li class="hidden-xs" style="pointer-events: none;"><a href="/info" style="background: #41ace2 !important; color: #fff !important;">1</a></li>,
        <li class="hidden-xs"><a href="/info/page2#PCB">2</a></li>,
        <li class="hidden-xs"><a href="/info/page3#PCB">3</a></li>,
        <li class="hidden-xs"><a href="/info/page4#PCB">4</a></li>,
        <li class="hidden-xs"><a href="/info/page5#PCB">5</a></li>,
        <li><a href="/info/page2#PCB" rel="next"><span>Next</span></a></li>,
        <li><a href="/info/page9#PCB"><span>Last</span></a></li>
    </ul>
</nav>

Это код Python, проходящий через 'сIDE

>>> soup = BeautifulSoup(driver.page_source, features='html.parser')
>>> next = soup.find("ul", attrs={"id":"info_pageclass"}).find_all("li")[7]
>>> print(next)
<li>
<a href="/info/page2#PCB" rel="next">
<span>Next</span>
</a>
</li>

Все эти операторы возвращают ту же ошибку, как показано (один раз)

>>> next.send_keys(Keys.ENTER)
>>> next.click()
>>> next.a.click()
TypeError: 'NoneType' object is not callable

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Используйте Selenium и BeautifulSoup.Используйте infinite while loop и ищите следующий элемент кнопки. Однако, это прекратится, когда на странице нет следующего элемента кнопки.

from selenium import webdriver
from bs4 import BeautifulSoup

url = 'Url here'
driver = webdriver.Chrome()
driver.get(url)
soup = BeautifulSoup(driver.page_source,"html.parser")

#While loop search for the `Next` button on the page if not found jumps out from the loop.
while True:
    #Some code of your operation

    if len(driver.find_elements_by_xpath('//ul[@id="info_pageclass"]//li/a/span[contains(.,"Next")]'))>0:
        driver.find_element_by_xpath('//ul[@id="info_pageclass"]//li/a/span[contains(.,"Next")]').click()
        soup = BeautifulSoup(driver.page_source,"html.parser")
    else:
        break
0 голосов
/ 03 июня 2019

К click() на элементе с текстом Далее вам нужно заставить WebDriverWait для элемента быть активным , и вы можете использовать любой из следующие решения:

  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "ul.pageclass#info_pageclass li>a[rel='next']>span"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//ul[@class='pageclass' and @id='info_pageclass']//li/a[@rel='next']/span[text()='Next']"))).click()
    
  • Примечание : необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
...