Нужна помощь с использованием selenium

#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): этот метод будет ждать, пока любой элемент станет интерактивным, прежде чем продолжить. (вы можете увеличить время в зависимости от времени загрузки вашей страницы).