Щелкните по разбивке на страницы с помощью Selenium в Python

#python #selenium #onclick #click

#python #selenium #onclick #нажмите

Вопрос:

Я работаю над созданием платформы автоматизации с использованием Selenium в Python, где я пытаюсь перебирать целевые страницы на HubSpot.com нажав на кнопку «Далее».

Следующая кнопка находится в следующем HTML-файле в соответствии с инспектором Chrome:

 <a class="next" data-reactid=".0.1.0.0.2.1.0.0.1.0.$next.0">
    <span data-reactid=".0.1.0.0.2.1.0.0.1.0.$next.0.1">Next</span>
    <span class="right" data-reactid=".0.1.0.0.2.1.0.0.1.0.$next.0.2"></span>
</a>
  

И я нажимаю на кнопку, используя следующий код Python:

 time.sleep(3)
wait(self.driver, """//a[@class="next" and not(@disabled)]""")
            nextButton = self.driver.find_element(By.XPATH, """//a[@class="next" and not(@disabled)]""")
            hov = ActionChains(self.driver).move_to_element(nextButton)
            hov.click().perform()
  

где моя функция wait () определяется как:

 def wait(dr, x):
    element = WebDriverWait(dr, 5).until(
        EC.presence_of_element_located((By.XPATH, x))
    )
    return element
  

Это отлично работает на первой странице. Но по какой-то причине, когда я добираюсь до второй страницы, он не может нажать кнопку. Никаких ошибок, он просто начинает делать то, что должен, на третьей странице, но на второй странице. Кроме того, если я остановлю скрипт непосредственно перед тем, как он должен нажать на кнопку Далее на второй странице, я увижу, что кнопка выделена в Chromedriver.

Следующая кнопка расположена в следующем HTML-файле на странице 2 в соответствии с инспектором Chrome::

 <a class="next" data-reactid=".0.1.0.0.2.1.0.0.1.0.$next.0">
    <span data-reactid=".0.1.0.0.2.1.0.0.1.0.$next.0.1">Next</span>
    <span class="right" data-reactid=".0.1.0.0.2.1.0.0.1.0.$next.0.2"></span>
</a>
  

Есть предложения? У меня нет идей.

Комментарии:

1. Это внезапно начнет работать, если вы добавите режим ожидания между 1-м и 2-м щелчком мыши?

2. Я полагаю, вы используете этот код два раза (по одному разу на страницу), верно?:) Почему вы используете ActionChains вместо простого click() ?

3. @LeviNoecker: у меня уже есть сон между щелчками. К сожалению, это ничего не меняет.

4. @Andersson: Я также пробовал использовать метод щелчка. Никаких изменений.

5. Попробуйте использовать element_to_be_clickable вместо presence_of_element_located as element = WebDriverWait(dr, 5).until(EC.element_to_be_clickable((By.XPATH, x))) и дайте мне знать.

Ответ №1:

Мне удалось найти обходной путь. Вместо того, чтобы пытаться нажать кнопку далее, я нажимаю соответствующую кнопку страницы. Для начала я определяю j =2, а затем использую следующий код:

 if self.driver.find_elements(By.XPATH, """//a[@class="next" and not(@disabled)]""") != 0:
                xpathstring = """//div[@class="hs-pagination"]/ul/li/a[text()="%s"]""" % (j)
                waitclick(self.driver, xpathstring)
                nextButton = self.driver.find_element(By.XPATH, xpathstring)
                hov = ActionChains(self.driver).move_to_element(nextButton)
                hov.click().perform()
                time.sleep(3)
                j = j   1
  

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