Python Selenium нажмите кнопку Google «Я согласен»

#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: iframe в devtools

Сначала вам нужно переключиться на этот фрейм, нажать кнопку, а затем вернуться к содержимому по умолчанию (главная страница)

 
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()