Как превратить Xpath в al oop в python? - PullRequest
0 голосов
/ 13 июля 2020

У меня есть следующий код:

button = driver.find_element_by_xpath("/html/body/div[3]/div/div[1]/div[2]/div[2]/div[2]/div[3]/div[1]")
ActionChains(driver).move_to_element(button).click(button).perform()

в следующий раз, когда я захочу нажать на эту кнопку с использованием селена, путь x изменится на

button = driver.find_element_by_xpath("/html/body/div[3]/div/div[1]/div[2]/div[2]/div[2]/div[3]/div[2]")
ActionChains(driver).move_to_element(button).click(button).perform()

Я хочу преобразовать это в for посмотрите в диапазоне (1,5). Я использовал приведенный ниже код:

l=[1,2,3,4,5]
string=str(l)
for i in string:
  button = driver.find_element_by_xpath("/html/body/div[3]/div/div[1]/div[2]/div[2]/div[2]/div[3]/div"+i)
  ActionChains(driver).move_to_element(button).click(button).perform()
  time.sleep(5)

, но получаю следующую ошибку:

 raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: Unable to locate an element with the xpath expression /html/body/div[3]/div/div[1]/div[2]/div[2]/div[2]/div[3]/div[ because of the following error:
SyntaxError: Failed to execute 'evaluate' on 'Document': The string '/html/body/div[3]/div/div[1]/div[2]/div[2]/div[2]/div[3]/div[' is not a valid XPath expression.
  (Session info: chrome=83.0.4103.61)

1 Ответ

0 голосов
/ 13 июля 2020

Имея большие xpath, такие как это fr agile, сложно ориентироваться. Вы, вероятно, добьетесь большего успеха с меньшим и более точным xpath.

Решение вашей проблемы: Если вы посмотрите на свою ошибку SyntaxError: Failed to execute 'evaluate' on 'Document': The string '/html/body/div[3]/div/div[1]/div[2]/div[2]/div[2]/div[3]/div[' is not a valid XPath expression. Это не усечено. Это тот xpath, который вы ищете - вы заканчиваете его открытой квадратной скобкой, поэтому он недействителен.

Посмотрите, как сделать эту строку xpath действительной, прежде чем вводить ее в find_by.

[изменить - URL, указанный в комментариях]

Посмотрев на предоставленную страницу, попробуйте:

button = driver.find_element_by_xpath("//input[@class='amscroll-load-button']")
ActionChains(driver).move_to_element(button).click(button).perform()

Это меньший xpath, который идет прямо к объект без навигации по всей DOM.

Когда я запускаю этот xpath, он всегда идентифицирует только 1 объект. Даже если вы щелкнете по нему, и страница переместится, куда бы она ни переместилась, она все равно идентифицирует только одну.

Если вы хотите использовать это, имейте в виду, что при нажатии на нее происходит асинхронная загрузка страницы. Вам также понадобится динамический c ждать, чтобы данные / страница загрузились, прежде чем вы нажмете его в следующий раз. Если вы хотите просто посмотреть, работает ли он, ленивый подход состоит в том, чтобы ввести несколько секунд ожидания / ожидания между командами щелчка. это ресурс. Несколько видеороликов по 10 минут каждое могут избавить от головной боли о том, как получить нужные объекты.

...