элемент, не кликабельный из выпадающего меню

#python #web-scraping #select #drop-down-menu #webdriver

Вопрос:

используя selenium, я пытаюсь выбрать определенное значение в выпадающем меню, но у меня всегда возникает ошибка

 %reset -sf

site = 'https://www.mytek.tn/informatique/ordinateurs-portables/pc-portable.html'


driver.get(site)
sleep(1)

page_cat = requests.get(site)

tree_cat = html.fromstring(driver.page_source)

btn_all = tree_cat.xpath(".//option[@value='all']")
if len(btn_all) == 0:
    print("btn all dont exist")
else:
    print('choice all exist')

dropdown = Select(driver.find_element_by_id('limiter'))

dropdown.select_by_visible_text('Tous')

#dropdown.select_by_value('all')  # same error : ElementNotInteractableException
 

я попытался посмотреть, может ли селен прочитать все элементы в выпадающем меню : да

    print("All selected options using ActionChains : n")
    for opt in dropdown.options:
        print(opt.get_attribute('innerText'))
    time.sleep(5)
 

всегда одна и та же ошибка

 ElementNotInteractableException: Message: element not interactable: Element is not currently visible and may not be manipulated
 

Я схожу с ума

мой импорт:

 #imports here
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains


import requests
import time
from time import sleep

from lxml import html
import logging as log
import pandas as pd
 

Ответ №1:

Выпадающее меню, к которому вы пытаетесь получить доступ, появляется в нижней части страницы, а не внутри изначально видимого экрана.
Чтобы получить доступ к нему с помощью Selenium, вам сначала нужно перейти к этому элементу.
Кроме того, там есть 2 select с похожими локаторами, в то время как вам нужен второй из них, поэтому вам следует использовать исправленный локатор

 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.action_chains import ActionChains

actions = ActionChains(driver)
wait = WebDriverWait(driver, 20)

dropdown = wait.until(EC.presence_of_element_located((By.XPATH, "(//select[@id='limiter'])[last()]")))
time.sleep(1)
actions.move_to_element(dropdown).perform()
time.sleep(0.5)
dropdown = Select(driver.find_element_by_xpath("(//select[@id='limiter'])[last()]"))
dropdown.select_by_visible_text('Tous')
 

Я надеюсь, что это сработает для вас.

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

1. я получаю ошибку: «Ошибка атрибута: для перемещения требуется веб-элемент»