#python #selenium #selenium-webdriver #selenium-chromedriver
Вопрос:
Эй, у меня есть этот сайт : https://realmeupdater.com/ Я хочу выполнить поиск по своему запросу и получить первый URL-адрес результата, щелкнув по нему. как я могу это сделать? Я попытался щелкнуть элемент и отправить запрос, но это дает мне некоторую ошибку.
Вот Код:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.options import Options
import asyncio
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver import ActionChains
GOOGLE_CHROME_BIN = 'path'
CHROME_DRIVER = 'path'
async def realme_rom_search(query):
url = "https://realmeupdater.com/"
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.binary_location = GOOGLE_CHROME_BIN
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--start-maximized")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-gpu")
driver = webdriver.Chrome(executable_path=CHROME_DRIVER, options=chrome_options)
driver.get(url)
await asyncio.sleep(5)
wait = WebDriverWait(driver, 20)
select_ccs = "select2-device-container"
wait.until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, select_ccs))).click()
elem = wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "body > span > span > span.select2-search.select2-search--dropdown > input")))
elem.send_keys(query)
elem.send_keys(Keys.DOWN)
elem.send_keys(Keys.ENTER)
Но Я Получаю Эту Ошибку:
File "<string>", line 30, in realme_rom_search
File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 80, in click
self._execute(Command.CLICK_ELEMENT)
File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
return self._parent.execute(command, params)
File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <span class="select2-selection__rendered" id="select2-device-container" role="textbox" aria-readonly="true">...</span> is not clickable at point (457, 586). Other element would receive the click: <div role="dialog" aria-live="polite" aria-label="cookieconsent" aria-describedby="cookieconsent:desc" class="cc-window cc-banner cc-type-opt-out cc-theme-classic cc-bottom cc-color-override--1142219405 " style="">...</div>
(Session info: headless chrome=90.0.4430.212)
Все, что я хочу сделать, это найти и перейти по URL-адресу и получить информацию о ПЗУ и URL-адрес, кто-нибудь может мне помочь?
Заранее спасибо.
Ответ №1:
Здесь есть несколько проблем:
- Используемый вами локатор не уникален. В данном конкретном случае это не вызывает проблем, но в целом было бы лучше использовать уникальный локатор.
- Элемент, который вы пытаетесь щелкнуть, изначально отсутствует на видимом экране, поэтому сначала вам нужно прокрутить его в представление.
- Внизу есть блок элементов с просьбой принять файлы cookie. Этот элемент в настоящее время фактически принимает ваш щелчок. Однако, я думаю, это можно решить, прокрутив ваш элемент в поле зрения.
Поэтому, пожалуйста, попробуйте следующее:
from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_element_by_css_selectorid(select_ccs)
actions = ActionChains(driver)
actions.move_to_element(element).perform()
Это должно помочь.
Если этого все еще недостаточно, попробуйте закрыть блок cookie до этого, чтобы он был:
from selenium.webdriver.common.action_chains import ActionChains
wait.until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, 'a[aria-label="deny cookies"]'))).click()
wait.until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, 'a[aria-label="dismiss cookie message"]'))).click()
element = driver.find_element_by_css_selectorid(select_ccs)
actions = ActionChains(driver)
actions.move_to_element(element).perform()
Ответ №2:
Сначала вам нужно прокрутить веб-страницу до конца, чтобы селен знал, где находится раскрывающийся список.
Используйте приведенный ниже код для прокрутки до конца :
driver.execute_script("var scrollingElement = (document.scrollingElement || document.body);scrollingElement.scrollTop = scrollingElement.scrollHeight;")
Во-вторых, это падение построено с использованием элементов пользовательского интерфейса и LI, поэтому выбрать класс из Selenium не получится. Все, что вам нужно сделать, это сохранить все элементы в списке, а затем вы можете найти нужный элемент и после сравнения строк нажать на него. Ниже приведен пример кода :
Код :
driver = webdriver.Chrome("C:\Users:\Desktop\Selenium Python\chromedriver.exe")
driver.maximize_window()
wait = WebDriverWait(driver, 30)
driver.get("https://realmeupdater.com/")
sleep(2)
driver.execute_script("var scrollingElement = (document.scrollingElement || document.body);scrollingElement.scrollTop = scrollingElement.scrollHeight;")
wait.until(EC.visibility_of_element_located((By.ID, "select2-device-container"))).click()
all_options = driver.find_elements(By.CSS_SELECTOR, "#select2-device-results li")
for option in all_options:
if option.text =='realme 2 Pro (RMX1801EX)':
option.click()
print("Operation done successfully")
Комментарии:
1. @Jainam : Рад, что это сработало для вас. Пожалуйста, поднимите голос и примите ответ.