Selenium нажимает кнопку "Далее" вместо кнопки "Назад" - PullRequest
1 голос
/ 18 июня 2020

Пытаюсь очистить эту веб-страницу на предмет цен, и мне нужно, чтобы цены были в долларах США, так что это валюта, которую я понимаю. Однако, когда я изначально загружаю URL-адрес, он дает цены в нескольких, казалось бы, случайных валютах. Я обнаружил, что могу изменить это, нажав кнопку «Далее», а затем кнопку «Назад», но когда я попытался автоматизировать это, это не сработало. Вместо этого при запуске этого кода следующая кнопка щелкает дважды, а не один раз, ожидая в течение пяти секунд, а затем нажимая кнопку «Назад». Вот код, который я использую в настоящее время, который может воспроизвести эту проблему.

from selenium import webdriver
driver = webdriver.Chrome(r'C:\Users\Hank\Desktop\chromedriver_win32\chromedriver.exe')
driver.get('https://steamcommunity.com/market/listings/440/Unusual%20Old%20Guadalajara')

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import StaleElementReferenceException

import time
time.sleep(5)

action = ActionChains(driver)

next_button=wait(driver, 10).until(EC.element_to_be_clickable((By.ID,'searchResults_btn_next')))
action.move_to_element(next_button).click().perform()
time.sleep(5)
back_button=wait(driver, 10).until(EC.element_to_be_clickable((By.ID,'searchResults_btn_prev')))
action.move_to_element(back_button).click().perform()

Спасибо, мы очень благодарны за ваше время и помощь. Направьте меня на соответствующий вопрос, если на него уже был дан ответ где-то еще.

1 Ответ

1 голос
/ 18 июня 2020

Вам не нужен класс ActionChains, он работает по методу .click().

Попробуйте следующий код:

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

driver = webdriver.Chrome(r'C:\Users\Hank\Desktop\chromedriver_win32\chromedriver.exe')
driver.get('https://steamcommunity.com/market/listings/440/Unusual%20Old%20Guadalajara')

wait = WebDriverWait(driver, 20)

next_button = wait.until(EC.element_to_be_clickable((By.ID,'searchResults_btn_next')))
next_button.click()
time.sleep(5)
back_button = wait.until(EC.element_to_be_clickable((By.ID,'searchResults_btn_prev')))
back_button.click()

Но обратите внимание, time.sleep(5) - плохой способ, вы можете использовать другой способ, например: дождитесь появления второго элемента страницы.

Или вместо time.sleep(...) в этом случае вы можете использовать этот код:

wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'.pagebtn.disabled')))

Выше disable previous button с тех пор, как вы попали на первую страницу, и исчезнет, ​​когда вы перейдете на вторую. Используйте .invisibility_of_element_located, это будет эффективнее.

...