如何使用硒处理定时弹出窗口?

时间:2019-05-08 12:52:11

标签: python selenium selenium-webdriver popup

我找不到任何有关如何正确处理定时弹出窗口的指南。我的目标是关闭弹出窗口,因为弹出窗口会中断硒与网站的交互。最大的问题是,每次我打开网站时,弹出窗口的时间都不相同,这会有所不同。

我尝试在代码中插入一个简单的“ 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 :(得分:0)

使用While循环和WebdriverWait(在提到的timeoutpoll_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

已编辑

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

答案 1 :(得分:0)

对于这种情况,您应该使用显式等待。它将等待给定条件满足且不再等待。显式等待每半秒检查一次条件。如果条件在给定时间内不满足,则将引发超时异常。

尝试一下:

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

答案 2 :(得分:0)

如果不想等待测试开始时弹出窗口,也许创建一个与测试一起运行的后台线程就可以解决问题。

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...

这不会使您的测试等待弹出窗口继续显示,而是会在测试运行时尝试检测并关闭弹出窗口

希望有帮助