Ошибка сканирования Amazon, элемент не может быть прокручен в представлении - PullRequest
0 голосов
/ 16 сентября 2018

У меня проблема со сканированием страниц на Amazon.

Я пытался использовать:

  • Выполнение скрипта JS
  • Цепочки действий
  • Явные ожидания

Кажется, ничего не работает.Все выдает одно исключение или ошибку или другое.

Базовый скрипт

ff = create_webdriver_instance()
ff.get('https://www.amazon.ca/gp/goldbox/ref=gbps_ftr_s-3_4bc8_dct_10-?gb_f_c2xvdC0z=sortOrder:BY_SCORE,discountRanges:10-25%252C25-50%252C50-70%252C70-&pf_rd_p=f5836aee-0969-4c39-9720-4f0cacf64bc8&pf_rd_s=slot-3&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=A3DWYIK6Y9EEQB&pf_rd_r=CQ7KBNXT36G95190QJB1&ie=UTF8')
next_button = ff.find_element_by_xpath('(//li/a[contains(text(), "Next")])[1]')

Попытка № 1: Выполнение JS

Скрипт

ff.execute_script('arguments[0].scrollIntoView()', next_button)

Ошибка

Element could not be scrolled into view

Попытка № 2: цепочка действий

Сценарий

actions = ActionChains(ff)
actions.move_to_element(next_button)
actions.click(next_button)
actions.perform()

Ошибка

TypeError: rect is undefined

Попытка № 3: явное ожидание

next_button = WebDriverWait(ff, 60).until(
    EC.visibility_of_element_located((By.XPATH, '(//li/a[contains(text(), "Next")])[1]'))
)

Я также пытался использовать element_to_be_clickable,Оба они заканчиваются тайм-аутом.

1 Ответ

0 голосов
/ 16 сентября 2018

Это потому, что вы пытаетесь обработать скрытую ссылку. Попробуйте ниже вместо

next_button = ff.find_element_by_partial_link_text('Next')
next_button.click()

или

next _button = ff.find_element_by_link_text('Next→')

Обратите внимание, что find_element_by_partial_link_text / find_element_by_link_text ищет только видимые ссылки.

Также вам может понадобиться позвонить

ff.implicitly_wait(10)

один раз в вашем скрипте (где-то после определения вашего экземпляра WebDriver) или используйте ExplicitWait, как показано ниже

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

next_button = WebDriverWait(ff, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Next→')))

чтобы быть уверенным, что требуемый элемент будет найден даже с задержкой рендеринга

...