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

#python #selenium

Вопрос:

Я пытаюсь ввести текст в строку поиска веб-сайта(https://www.taste.com.au/ ), но я получаю сообщение об ошибке: элемент недоступен для взаимодействия, когда я пытаюсь отправить ключ элементу .

Я пытался

 x = driver.find_element_by_name("q").send_keys(menuName)
 

и

 x = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@name='q']")))
x.send_keys(abc)
 

и даже

 x = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,"//*[@class='search-box']")))
    x = WebDriverWait(submitSearchArea,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@name='q']")))
 

Затем я попытался посмотреть, виден ли элемент

 print(x.is_displayed())
 

и это выходит как ложь, но на сайте это видно

Есть какое-нибудь решение?

Ответ №1:

Используйте приведенный ниже CSS_SELECTOR :

 h1.text-center div input
 

Код :

 x = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"h1.text-center div input")))
x.send_keys('abc')
 

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

1. Это, казалось, сработало, не могли бы вы объяснить, почему селектор css работал, а не xpath или по имени

2. Это потому, что там есть 2 элемента, расположенных рядом //*[@name='q'] , поэтому мы должны специально указать на нужный элемент

3. @kibb : добавление в комментарий Пророка «Даже если вы преобразуете этот css-селектор в XPATH «, это сработает. Но СЕЛЕКТОРЫ CSS намного лучше локализуются по сравнению с xpath, потому что каждый браузер имеет один и тот же движок для css, но разные движки для xpath.

Ответ №2:

Попробуйте сначала нажать на этот элемент и только после этого отправить текст.

 x = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"div.container.search-parallax-content input[name='q']")))
x.click()
x.send_keys(abc)
 

Как уже упоминалось cruisepandey, в XPath есть 2 элемента //*[@name='q'] , поэтому нам нужно более точно выбрать нужный элемент

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

1. Это не сработало, появилось исключение тайм-аута, когда я использовал element_to_be_clickable @Prophet

2. @Пророк : есть два элемента с таким названием. так что это может работать неправильно.

Ответ №3:

есть 2 элемента с точно таким же именем q , поэтому сначала нам нужно отфильтровать их и проверить, какой из них отображается.

 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

url = "https://www.taste.com.au/"
driver = webdriver.Firefox(executable_path="") # Driver PATH
driver.get(url)

input_field = None

elements = WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.NAME, "q"))
    ) # All input Elements With "q" name
    

for elem in elements:
    # We need to find the real input field which is displayed on the screen
    if elem.is_displayed():
        input_field = elem

input_field.send_keys("Your Keys")