#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
@Prophet2. @Пророк : есть два элемента с таким названием. так что это может работать неправильно.
Ответ №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")