#python #selenium
#python #селен
Вопрос:
Я хочу перейти на этот сайт: http://www.datiopen.it/it/opendata/Mappa_delle_stazioni_ferroviarie_in_Italia Затем нажмите на вкладку «Tabella», затем посмотрите вторую страницу (из 64) таблицы, однако я потерпел неудачу в первой части, я не могу создать код для нажатия на вкладку «Tabella».
import requests
from selenium import webdriver
driver.get('http://www.datiopen.it/it/opendata/Mappa_delle_stazioni_ferroviarie_in_Italia')
element = driver.find_element_by_id("Tabella")
element.click()
И вот html-код, который я использовал для поиска:
<li id="Tabella" class="Table_img ui-state-default ui-corner-top ui-tabs-selected ui-state-active">
<span id="span_table_img" class="span_img"></span>
<a href="#ui-tabs-1" rel="nofollow">Tabella</a> </li>
Спасибо всем!
Комментарии:
1. В чем ошибка?
2. @Wups Я изменил его, чтобы
element = driver.find_element_by_xpath("//a[@href='#ui-tabs-1']")
он все еще не работал. ошибка:ElementNotInteractableException: element not interactable (Session info: chrome=85.0.4183.102)
Ответ №1:
Добавьте время ожидания перед доступом к элементу таблицы.
time.sleep(5)
driver.find_element_by_id('Tabella').click()
Комментарии:
1. Это сработало действительно хорошо! Не могли бы вы рассказать мне, в чем логика этого?
2. Логика @Mark Bils заключается в том, что selenium пытается получить доступ к элементу при загрузке страницы, но некоторые элементы все еще находятся в процессе, поэтому их нет в DOM страницы. Вы можете использовать
time.sleep
илиWebDriverWait
для их полной загрузки.
Ответ №2:
Чтобы нажать на Tabella
вкладку, вам нужно вызвать WebDriverWait
() и дождаться element_to_be_clickable
(), и вы можете использовать следующий локатор.
Текст ссылки:
driver.get("http://www.datiopen.it/it/opendata/Mappa_delle_stazioni_ferroviarie_in_Italia")
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.LINK_TEXT,"Tabella"))).click()
XPATH:
driver.get("http://www.datiopen.it/it/opendata/Mappa_delle_stazioni_ferroviarie_in_Italia")
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//a[text()='Tabella']"))).click()
Вам необходимо импортировать следующие библиотеки.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
Комментарии:
1. Спасибо, но действительно ли необходимо использовать так много библиотек? Я имею в виду, что это довольно простая задача
2. @MarkBils:
WebDriverWait()
это лучшая практика при взаимодействии с браузером. Это поможет вам обойти проблему синхронизации браузера, и вы можете обойти проблему, подобнуюElementNotInteractableException
и не исключающую такого элемента.
Ответ №3:
Проблема с вашим кодом
Вы пытаетесь щелкнуть элемент до того, как он будет доступен / готов к щелчку в DOM.
Решение
Вам нужно дождаться загрузки элемента и стать интерактивным, чтобы выполнить любое действие с тем же элементом.
Код
driver = webdriver.Chrome()
driver.get('http://www.datiopen.it/it/opendata/Mappa_delle_stazioni_ferroviarie_in_Italia')
def wait_for_element_to_be_clickable(element):
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, element)))
wait_for_element_to_be_clickable("Tabella")
element = driver.find_element_by_id("Tabella")
element.click()
print("executed")
def wait_for_element_to_be_clickable(element):
этот метод будет ждать, пока любой элемент станет интерактивным, прежде чем продолжить. (вы можете увеличить время в зависимости от времени загрузки вашей страницы).