Как имитировать нажатие кнопки в selenium?

#python #selenium-webdriver

#python #selenium-webdriver

Вопрос:

В настоящее время я изучаю selenium. Я попытался имитировать нажатие кнопки CSV-файла из url «https://worldpopulationreview.com/countries/countries-by-gdp/#worldCountries «.

Я сделал:

 Right click the csv icon
Inspect and copy the full xpath
  

Затем я использовал следующий код:

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import os

driver = webdriver.Chrome()

url = 'https://worldpopulationreview.com/countries/countries-by-gdp'
driver.get(url)

xpath = '/html/body/div[1]/div/div[1]/div[2]/div[2]/div[1]/div/div/div/div[2]/div[1]/a[2]'

btn = driver.find_element_by_xpath(xpath)
btn.click()

# df = pd.read_csv(os.path.expanduser('~/Downloads/data.csv'))
# print(df.head())
# driver.close()
  

Ошибка

 WebDriverException: Message: unknown error: Element <a>...</a> is not clickable at point (1070, 879). Other element would receive the click: <div id="google_ads_iframe_/15184186/worldpopulationreview_adhesion_0__container__" style="border: 0pt none;">...</div>
  (Session info: chrome=85.0.4183.121)
  (Driver info: chromedriver=2.42.591059 (a3d9684d10d61aa0c45f6723b327283be1ebaad8),platform=Mac OS X 10.15.7 x86_64)
  

Попытки

Я пробовал несколько попыток с разными xpath, но безрезультатно. Как имитировать нажатие кнопки для этого конкретного веб-сайта?

Комментарии:

1. Вы внимательно прочитали сообщение об ошибке? Что он сказал? Вы смотрели на страницу, когда была предпринята попытка нажатия? Что вы увидели?

Ответ №1:

Индуцировать WebDriverWait () и ждать element_to_be_clickable () и следующий селектор css.

 driver.get("https://worldpopulationreview.com/countries/countries-by-gdp")
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"a[download='csvData.csv']"))).click()
  

Вам необходимо импортировать следующие библиотеки.

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

Ответ №2:

Иногда selenium не может щелкнуть по элементу, если что-то мешает. В этом случае вы можете использовать javascript. Но сначала я бы подождал, пока элемент станет интерактивным.

 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
from selenium.webdriver.common.keys import Keys
import os

driver = webdriver.Chrome()

url = 'https://worldpopulationreview.com/countries/countries-by-gdp'
driver.get(url)

xpath = '/html/body/div[1]/div/div[1]/div[2]/div[2]/div[1]/div/div/div/div[2]/div[1]/a[2]'

# btn = driver.find_element_by_xpath(xpath)
btn = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//a[@download='csvData.csv']")))
driver.execute_script("arguments[0].click();", btn)
# btn.click()

# df = pd.read_csv(os.path.expanduser('~/Downloads/data.csv'))
# print(df.head())
# driver.close()
  

Комментарии:

1. Это сработало, но вместо csv загружается json. как загрузить csv?

2. @MilkyWay001 Я обновил xpath с того, который вы предоставили, чтобы настроить таргетинг на csv.