Проверка полей с использованием Xpath w / Selenium

#selenium #selenium-webdriver #web-scraping

#selenium #selenium-webdriver #очистка веб-страниц

Вопрос:

Я создаю скрипт .py для автоматизации запросов к хранилищу данных Всемирного банка с использованием Selenium.

Скрипт установит флажки в меню «Страны», «Серия» и «Время». У меня нет проблем с выбором массивов стран.

 country_codes = ['AUT', 'BRA', etc.]
for country in country_codes:
    country_xpath = '//*[@id="chk[Stat_Ctry_Ext].[List].amp;['   str(country)   ']"]'
    driver.find_element_by_xpath(country_xpath).click()
  

Однако при выборе серии возникает NoSuchElementException ошибка.

 driver.find_element_by_xpath('//*[@id="chk[STATS_Series_Ext].[Topic].amp;[UIS.NERA.2.M]"]')
  

Изображение: веб-инспектор

Ответ №1:

Пожалуйста, попробуйте приведенный ниже код и дайте мне знать, если у вас возникнут какие-либо проблемы —

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)
action = ActionChains(driver)

driver.get('https://databank.worldbank.org/source/education-statistics')
time.sleep(5)

country_codes = ['AFG', 'AUT', 'BRA']

for country in country_codes:
    driver.find_element_by_xpath('//*[@id="chk[Stat_Ctry_Ext].[List].amp;['   country   ']"]').click()

# Click on the series tab
driver.find_element_by_xpath('(//a[contains(@title,"Series")])[1]').click()

Series_UIS_NERA_2_M = wait.until(
    EC.visibility_of_element_located((By.XPATH, '//*[@id="chk[STATS_Series_Ext].[Topic].amp;[UIS.NERA.2.M]"]')))
driver.find_element_by_xpath('//*[@id="chk[STATS_Series_Ext].[Topic].amp;[UIS.NERA.2.M]"]').click()
  

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

1. Если это произойдет, было бы неплохо, если бы вы могли пометить это как ответ. Чтобы люди поняли, что эта проблема была решена.

2. Пара вопросов: является ли тот факт, что presence_of_element_located() также работает здесь, исключительно потому, что мое соединение достаточно быстрое, чтобы меню уже было видно до истечения времени ожидания? Также: является ли хорошей практикой включение Xpaths, как вы сделали ‘(//a[содержит (@title,»Series»)])[1]’, в отличие от копирования и вставки ‘//*[@id=»panel_STATS_Series_Ext»]/ div[1] / h4 / a’?

3. 1. presence_of_element_located( ) будут ждать, пока элемент не будет найден в HTML. Если ваше соединение быстрее, то элемент будет загружаться быстрее, иначе он будет ждать до 20 секунд (как мы упоминали при инициализации WebDriverWait. 2. Да, это хорошая практика, поскольку я напрямую ориентируюсь на элемент вместо навигации, подобной ‘//*[@id=»panel_STATS_Series_Ext»]/div[1] / h4 / a». (Лучше не использовать absolute XPath в вашем коде, потому что это может не сработать в будущем)

4. Отлично. Это очень помогает.