我找不到任何有关如何正确处理定时弹出窗口的指南。我的目标是关闭弹出窗口,因为弹出窗口会中断硒与网站的交互。最大的问题是,每次我打开网站时,弹出窗口的时间都不相同,这会有所不同。
我尝试在代码中插入一个简单的“ try”方法,以在弹出窗口出现时执行代码的位置,但是由于可变的弹出时间而无法正常工作。
def pop_up_off(self):
try:
self.driver.find_element_by_css_selector('a_css_selector').click()
sleep(.5)
except Exception:
pass
预期结果是摆脱与正在进行的硒脚本交互的可变定时弹出窗口。
答案 0 :(得分:0)
使用While
循环和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
已编辑
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...
这不会使您的测试等待弹出窗口继续显示,而是会在测试运行时尝试检测并关闭弹出窗口
希望有帮助