(Python, селен) неявное и явное ожидание не работает - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь написать программу, которая:

1) вводит имя в строке поиска

2) пресса вводят

3) находит первый результат поиска, который является ссылкой на другую страницу

4) щелкает первый результат

5) находит указанный элемент на результирующей странице

6) копирует этот элемент

7) печатает этот элемент в PyCharm

8) Повторяется для каждой записи в предварительно загруженном массиве (устанавливается в «имена»)

Ниже приведена часть кода, предназначенная для этого.

from selenium import webdriver
import time
import xlrd


driver = webdriver.Chrome("path")

i=0
while i < len(names):

    a = names[i]
    driver.set_page_load_timeout(25)
    driver.get("https://www.healthgrades.com/")

    driver.find_element_by_id("search-term-selector-child").send_keys(a)
    driver.find_element_by_id("search-term-selector- 
    child").send_keys(u'\ue007')

    driver.implicitly_wait(20)
    first = driver.find_element_by_class_name('uCard__name')
    first.click()

    driver.implicitly_wait(20)
    elem= driver.find_element_by_class_name("office-street1")

    entry1 = elem.text
    time.sleep(1)
    print(entry1)
i += 1

Когда я запускаю программу, похоже, что код завершает шаг 4 (строка 13), прежде чем элемент на этом шаге становится ссылкой; чаще всего получаю ошибку

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"class name","selector":"office-street1"}

Я думаю, это означает, что он проходит через find_element_by_class_name и выполняет щелчок. Но когда я смотрю автоматизированную веб-страницу, я замечаю, что следующая страница никогда не открывается.

Чтобы это исправить, я попытался установить неявное ожидание (строка 15) перед поиском элемента uCard, но все равно получаю ту же ошибку.

Другие попытки решения:

  • Использование явного ожидания для ожидания элемента uCard_name

  • Очистка кэша / удаление истории поиска с каждым циклом

  • Использование WebDriverWait для остановки программы

Дополнительная информация:

  • Работа в Pycharm, версия Python 3.6

  • Windows 10, 64-битная

1 Ответ

0 голосов
/ 28 апреля 2018

Лучше всего использовать явное ожидание интересующего элемента. Таким образом, вы узнаете, что он есть, прежде чем нажимать на него или иным образом взаимодействовать с ним.

Так что обязательно добавьте этот импорт:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome("path")

# Only need to do this once per session
driver.implicitly_wait(20)

i=0
while i < len(names):

    a = names[i]
    driver.set_page_load_timeout(25)
    driver.get("https://www.healthgrades.com/")

    driver.find_element_by_id("search-term-selector-child").send_keys(a)
    driver.find_element_by_id("search-term-selector-child").send_keys(u'\ue007') 

    first = driver.find_element_by_class_name('uCard__name')
    first.click()

    timeout = 20
    # Explicitly wait 20 seconds for the element to exist.
    # Good place to put a try/except block in case of timeout.
    elem = WebDriverWait(driver, timeout).until(
           EC.presence_of_element_located(('className', 'office-street1'))
           )
    entry1 = elem.innerText
    ...
...