#python #selenium #web-crawler
#python #селен #веб-сканер
Вопрос:
Я пытаюсь очистить некоторые данные Google, но сначала я хочу нажать кнопку «Я согласен», которая появляется в Google. Это скрипт, который я использую для этого:
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
search_question = input("Ask a question: ")
driver = webdriver.Chrome("*Your Webdriver location*")
driver.wait = WebDriverWait(driver, 5)
driver.get("https://google.com")
time.sleep(1)
agree = driver.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="introAgreeButton"]/span/span')))
agree.click()
# time.sleep(0.2)
search = driver.find_element_by_class_name("gLFyf")
search.send_keys(search_question)
search.send_keys(Keys.ENTER)
Проблема в том, что selenium, похоже, не находит кнопку, и поэтому я получаю ошибку тайм-аута. (Я пробовал также с помощью find_element_by_xpath и все еще не работает).
Ответ №1:
Если вы прокрутите вверх в инспекторе devtools, вы заметите, что ваш элемент находится внутри iframe:
Сначала вам нужно переключиться на этот фрейм, нажать кнопку, а затем вернуться к содержимому по умолчанию (главная страница)
driver.get("https://google.com")
#active the iframe and click the agree button
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//iframe")))
agree = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="introAgreeButton"]/span/span')))
agree.click()
#back to the main page
driver.switch_to_default_content()
Это работает для меня.
К вашему сведению — на странице есть только 1 iframe, поэтому xpath //iframe
работает. Если бы их было несколько, вам нужно было бы идентифицировать их с более высокой точностью.
Ответ №2:
Если вы уже согласились, кнопка согласия не появится. Вот почему он не может найти указанный XPath.
Попробуйте это:
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
search_question = input("Ask a question: ")
driver = webdriver.Chrome(".chromedriver.exe")
driver.wait = WebDriverWait(driver, 5)
driver.get("https://google.com")
time.sleep(3)
# agree = driver.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="introAgreeButton"]/span/span')))
# agree.click()
# time.sleep(0.2)
search = driver.find_element_by_class_name("gLFyf")
search.send_keys(search_question)
search.send_keys(Keys.ENTER)
Комментарии:
1. Всплывающее окно не отображается. Проблема в том, что если я не удалю окно, то данные, которые возвращаются позже, не будут полными.
Ответ №3:
Удалось заставить его работать. Похоже, что одним из немногих элементов, которые являются интерактивными во всплывающем окне при первой загрузке сайта, является выпадающий список language, который я нашел по имени класса. Затем кнопка согласия обнаруживается, и вы также можете найти ее по классу.
driver.get("https://www.google.com")
driver.maximize_window()
time.sleep(2)
#finds clicks language dropdown, interaction unhides the rest of the popup html
driver.find_element_by_class_name('tHlp8d').click()
time.sleep(2)
#finds clicks the agree button now that it has become visible
driver.find_element_by_id('L2AGLb').click()
теперь у вас должна быть стандартная панель поиска и т. Д
Ответ №4:
у меня были некоторые проблемы с щелчком по всплывающим окнам, и проблема оказалась в этом click (). я не уверен, что это может быть та же проблема с urs или нет, но попробуйте изменить ur click на это :
agree = driver.find_element_by_xpath('//*[@id="introAgreeButton"]/span/span')
driver.execute_script("arguments[0].click();", agree)
Комментарии:
1. Да, я уже пробовал этот способ (извините, что не упомянул об этом) и все еще не работает. Проблема в том, что selenium не может найти кнопку
Ответ №5:
Проблема заключалась в том, что фреймы не менялись, вот код soulution:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome('C:\Users\gassp\OneDrive\Namizje\Python.projects\chromedriver.exe')
url = 'https://www.google.com/maps/'
driver.get(url)
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//*[@id="consent-bump"]/div/div[1]/iframe')))
agree = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="introAgreeButton"]/span/span')))
agree.click()
#back to the main page
driver.switch_to_default_content()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="searchboxinput"]'))).send_keys('gostilne')
driver.submit()