Есть ли способ дать ограничение времени для Selenium, чтобы найти элемент (ы)? - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь автоматизировать Google Maps с помощью драйвера Python Selenium Chrome, мой код стабилен, чтобы получить то, что мне нужно, , но не время производительности.

Я использую итеративный код для получения данных о продавцах через Google Карты, скорость получения 1 данных о продавце ниже 1 секунды при использовании Selenium, но когда код обнаружил исключение, это займет очень много времени, например 6-7секунд.

Вот некоторые итоги времени выполнения:

https://picoolio.net/image/dgxC (нормальное время выполнения)

https://picoolio.net/image/dgxT (время выполнения при исключениипроизошло в открытый час, слишком долго)

https://picoolio.net/image/dgxV (время выполнения, когда возникла исключительная ситуация, иногда запускается, как ожидается)

Вот некоторый код для получения списка открытых часов:

try:
      openhour = wait(driver, 1).until(EC.visibility_of_element_located((By.XPATH, 
                           './/span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]')))

      driver.execute_script("arguments[0].scrollIntoView(true);", openhour)
      openhour.click()
      openhourstacked = wait(driver, 1).until(EC.visibility_of_element_located((By.CLASS_NAME, 
                                  'section-open-hours-container-hoverable'))).get_attribute("aria-label")
      openhourlist = openhourstacked.split(",")
      openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1].split(".")
      openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1][0]

      except NoSuchElementException:
         openhourlist = []
         print("No Open Hour list in this merchant!")
         openhour_trig = True
      except WebDriverException:
         openhourlist = []
         print("Failed to load Open Hour list in this merchant!")
         openhour_trig = True

Множество рекомендаций говорят, что для правильного выполнения явного ожидания я должен использовать комбинацию WebDriverWait и EC (ожидаемые условия), и я попытался сделать это напрямую с приведенным выше кодом, но WebDriverWait, похоже, не работаетдля всех входящих исключений, другими словами, иногда успешно, а иногда - неудачно.

Я пытался заменить EC.visibility_of_all_element_located на EC.presence_of_all_element_located, но это не имеет значения.

IОжидается, что время выполнения будет по-прежнему плавным, когда возникнет какое-либо исключение, есть ли способ заставить Selenium прекратить поиск элементов в случае тайм-аута, кроме описанного выше способа?Или это проблема с интернет-соединением?Любые мысли приветствуются!

Обновление: поэтому я изменяю открытый часовой код на что-то вроде этого

try:
              if len(driver.find_elements(By.XPATH, './/span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]'))>0:
                        openhour = wait(driver, 5).until(EC.visibility_of_element_located((By.XPATH, 
                                       './/span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]')))
                        #openhour = driver.find_element_by_xpath('.//span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]')
                        driver.execute_script("arguments[0].scrollIntoView(true);", openhour)
                        openhour.click()
                        #openhourstacked = driver.find_element_by_class_name('section-open-hours-container-hoverable').get_attribute("aria-label")
                        openhourstacked = wait(driver, 5).until(EC.visibility_of_element_located((By.CLASS_NAME, 
                                              'section-open-hours-container-hoverable'))).get_attribute("aria-label")
                        openhourlist = openhourstacked.split(",")
                        openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1].split(".")
                        openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1][0]
                    else:
                        openhourlist = []
                        print("No Open Hour list in this merchant! (Not an Exception)")
                except NoSuchElementException:
                    openhourlist = []
                    print("No Open Hour list in this merchant!")
                    openhour_trig = True
                except WebDriverException:
                    openhourlist = []
                    print("Failed to load Open Hour list in this merchant!")
                    openhour_trig = True

Да, таким образом, это действительно позволяет избежать исключения, но это повторяетвыполняйте поиск, как и раньше, поэтому он может дать длительный поиск до 6-7 секунд снова, когда элементы не найдены .. явное ожидание тоже не очень помогает в этих терминах, я думаю

Ответы [ 3 ]

3 голосов
/ 22 апреля 2019

Резюме:

В вашем коде попробуйте увеличить время явного ожидания. Не будет замедлить, но это предотвратит эти исключения. Попробуйте 5 секунд вместо 1 секунды. Попробуйте это wait(driver,5)


Мы используем ожидание, потому что для загрузки DOM требуется время, и иногда нам нужно ждать загрузки / скрытия / изменения страницы / элементов, и мы должны действовать в соответствии с изменением.
Что делает явное ожидание, так это то, что оно ожидает до заданного времени ожидаемого условия, которое выполняется, и каждые 500 миллисекунд проверяет, выполняются ли условия или нет. Таким образом, вы теряете максимум 500 миллисекунд перед выполнением следующего задания. Если условия не будут выполнены вовремя, то возникнет исключение тайм-аута. Явные ожидания не решат всех ваших проблем.

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

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

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

driver.find_elements(By.ID, "locator").size()>0
0 голосов
/ 02 июня 2019

Я знаю, что это уже длинный вопрос и получить решения, Забыл обновить снова, но я думаю, я понял, что установка неявного ожидания на несколько секунд, например: 2 секунды, подобные этой driver.implicitly_wait(2), поможет ограничить WebDriver поиск по последним секундам, по сравнению с последними секундами, выдаст исключение

0 голосов
/ 22 апреля 2019

да явное ожидание (ожидание веб-драйвера) решает эту проблему. Еще один простой способ - создать цикл for с временными секундами и записать элементы поиска внутри цикла, поэтому, даже если он потерпит неудачу, он проверит 180сек и запишет условия, превышающие ожидаемое ожидание. время

  for (int second = 0; second < 60; second++) {
  try {} 
  catch (WebDriverException we) 
  {}
  if (second >= 60) {
  //write failure 
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...