Как обрабатывать всплывающие окна с использованием селена? - PullRequest
0 голосов
/ 08 мая 2019

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

Я попытался вставить простой метод try в код в место, где код выполняется, когда появляется всплывающее окно, но это не работает из-за переменной времени всплывающего окна.

def pop_up_off(self):
    try:
        self.driver.find_element_by_css_selector('a_css_selector').click()
        sleep(.5)
    except Exception:
        pass

Ожидаемый результат - избавиться от всплывающего окна переменной времени, которое взаимодействует с текущими сценариями селена.

Ответы [ 3 ]

0 голосов
/ 08 мая 2019

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

Попробуйте это:

WebDriverWait(driver,30).until(EC.presence_of_element_located((By.CSS_SELECTOR,"a_css_selector"))).click()

Чтобы использовать явное ожидание, вы должны импортировать следующее

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
0 голосов
/ 08 мая 2019

Возможно, создание фонового потока, работающего с вашим тестом, поможет, если вы не хотите ждать появления всплывающего окна в начале теста.

import threading

trigger = True #if this trigger is set to False, the thread stops running.

def pop_up_off(self):
    while trigger == True:
        try:
            self.driver.find_element_by_css_selector('a_css_selector').click()
            trigger = False
        except Exception:
            pass

-

def test(your args):
    #your test before the popup page is opened...
    close_popup = threading.Thread(target=pop_up_off, args= your args)
    close_popup.start()
    #your test after the popup page is opened...

Это не заставит ваш тест ждать появления всплывающего окна, оно попытается обнаружить и закрыть всплывающее окно во время выполнения теста

Надеюсь, это поможет

0 голосов
/ 08 мая 2019

Используйте While loop и WebdriverWait, где упомянуто timeout и poll_frequency, чтобы проверить наличие элементов, если он щелкнет по элементам и прервет цикл, иначе продолжайте до тайм-аута. Надеюсь, это поможет.

while(True):
  elements=WebDriverWait(self.driver, 300,1 ).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'a_css_selector')))
  if(len(elements)>0):
      self.driver.find_element_by_css_selector('a_css_selector').click()
      break
  else:
    continue

Обратите внимание: вам нужно использовать следующие операции импорта.

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

EDITED

while(True):
  elements=driver.find_elements_by_css_selector('a_css_selector')
  if(len(elements)>0):
      self.driver.find_element_by_css_selector('a_css_selector').click()
      break
  else:
    continue
...