Как отправить текст в поле поиска через Selenium и Python - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь передать аргументы поискового текста в HTML-коде с помощью Selenium в Python:

Я работаю над следующим HTML-кодом:

</form><form class="search-box-inner">
    <div class="input-container">
        <input type="text" class="typeahead search-box-input left" autocomplete="off" placeholder="Search ratings, research, analysts, and more..." maxlength="900"></div>
</form>

Код неесть идентификатор или имя.Он имеет элементы только по классу.

Я попробовал следующее

self.driver.find_elements_by_class_name('search-box-inner').send_keys("HSBC Bank plc")  

Но я получаю следующую ошибку:

AttributeError: 'list' object has no attribute 'send_keys'

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

self.driver.find_elements_by_class_name('search-box-inner')[0].send_keys("HSBC Bank plc")

Я получаю следующую ошибку:

"selenium.common.exceptions.WebDriverException: Message: unknown error: cannot focus element"

Я испробовал оба вышеуказанных метода для "typeahead search-box-input left "также.это выдает ту же ошибку.Ниже приведен код, который я использовал для этого:

self.driver.find_elements_by_xpath("//*[@class='typeahead search-box-input left']").send_keys("HSBC Bank plc")

Я снова получил следующую ошибку:

AttributeError: 'list' object has no attribute 'send_keys'

Затем я попытался получить первый элементсписок со следующим кодом:

self.driver.find_elements_by_xpath("//*[@class='typeahead search-box-input left']").[0].send_keys("HSBC Bank plc")  

Я снова получил следующую ошибку:

selenium.common.exceptions.ElementNotVisibleException: Message:
element not interactable

Я также попробовал следующий способ:

element = wait.until(Ec.visibility_of_element_located((By.XPATH, "//*[@placeholder='Search ratings, research, analysts, and more...']")))

Но не удалось отправить аргумент / ключи в строку поиска.
Любые предложения будут действительно полезны.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Почему бы не использовать селектор CSS, например,

.find_element_by_css_selector(".search-box-input").send_keys 

Вы можете расширить селектор, например, с помощью:

.search-box-input[placeholder^='Search ratings']
0 голосов
/ 22 февраля 2019

Что касается предоставленного вами HTML-кода, то совершенно очевидно, что в HTML DOM присутствует несколько <form> узлов.


Анализ ошибок

  • Первая попытка: self.driver.find_elements_by_class_name('search-box-inner') вернет Список , поэтому вы не можете вызвать send_keys(), и вы увидите ошибку как AttributeError: 'list' object has no attribute 'send_keys'
  • Вторая попытка: self.driver.find_elements_by_class_name('search-box-inner')[0] идентифицирует <form> узел, который не может находиться в focus , поэтому вы не можете вызвать send_keys(), и вы увидите ошибку как WebDriverException: Message: unknown error: cannot focus element"
  • Третья попытка: self.driver.find_elements_by_xpath("//*[@class='typeahead search-box-input left']") снова вернет Список , поэтому вы не сможете вызвать send_keys(), и вы увидите ошибку как AttributeError: 'list' object has no attribute 'send_keys'
  • Четвертая попытка: self.driver.find_elements_by_xpath("//*[@class='typeahead search-box-input left']").[0] не была действительной Стратегия локатора

Решение

Чтобы передать последовательность символов на нужный элемент, вы можете использовать любое из следующих решений:

  • Использование CSS_SELECTOR:

    self.driver.find_element_by_css_selector("form.search-box-inner input.typeahead.search-box-input.left[placeholder^='Search ratings']").send_keys("HSBC Bank plc")
    
  • Использование XPATH:

    self.driver.find_element_by_xpath("//form[@class='search-box-inner']//input[@class='typeahead search-box-input left' and starts-with(@placeholder, 'Search ratings')]").send_keys("HSBC Bank plc")
    
0 голосов
/ 21 февраля 2019

find_elements_by_xpath возвращает список webelement, поэтому вы не можете использовать метод send_keys непосредственно для этого.Вам нужно использовать find_element_by_xpath или find_elements_by_xpath("xpathExpression").get(0), если вам нужно использовать send_keys для элемента.

Для решения проблемы воспользуйтесь приведенными ниже советами:

  1. Попробуйте xpath self.driver.find_element_by_xpath("//div[@class='input-container']") вместо используемого вами xpath.

  2. Даже после использования вышеупомянутого xpath, если вы получаете ElementNotVisibleException, тогда, пожалуйста, проверьте, находится ли элемент в iframe, если да, то переключитесь на iframe и затем используйте send_keys на элементе.

    Чтобы переключиться в iframe, вы можете использовать: driver.switch_to.frame(driver.find_element_by_tag_name('iframe')), а затем send_keys на элементе, используя упомянутый xpath, и если вы хотите переключиться обратно на содержимое по умолчанию, вы можете использовать driver.switch_to.default_content()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...