функция asyn c с ожиданием селена - PullRequest
0 голосов
/ 27 марта 2020

Я создаю бот Selenium Chrome, используя Python. Я реализую python coroutine syn c функцию. Использование метода ожидания Selenium с функцией python syn c.

Я получил ошибку, поведение которой не соответствует ожидаемому.

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

Этот процесс заключает в себе python функцию syn c с await. Это не oop в соответствии с этим поведением.

Но запустить все сразу.

asyn c def

regionLists = ['111','222','333']
regionElem = self.browser.find_element_by_id("regionId")
regionSelect = Select(regionElem)
regionTasks = [
  self.parseCities(self.browser, regionSelect, regionValue)
  for regionValue in regionLists
]

result = await asyncio.wait(regionTasks)

Функция ParseCities

async def parseCities(self, browser, regionSelect, regionValue):
  regionSelect.select_by_value(regionValue)

  # ERROR AT THIS LINE BELOW
  wait(browser, 10).until(
      lambda b: len(Select(b.find_element_by_id("cityId")).options) > 1
  )

Ошибка

Task exception was never retrieved
future: <Task finished coro=<main.parseCities() done, defined at Selenium/main.py:139> exception=NoSuchElementException('Cannot locate option with value: 781111')>
Traceback (most recent call last):
  File "Selenium/main.py", line 140, in parseCities
    regionSelect.select_by_value(regionValue)
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/support/select.py", line 87, in select_by_value
    raise NoSuchElementException("Cannot locate option with value: %s" % value)
selenium.common.exceptions.NoSuchElementException: Message: Cannot locate option with value: 781111

1 Ответ

0 голосов
/ 28 марта 2020

Попробуйте подождать, пока элемент станет активным

Просто пример

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

 element = WebDriverWait(driver, 30).until(
    ec.element_to_be_clickable((By.ID, 'cityId')))

  element.click()
...