【实测】selenium脚本解决随机弹窗广告问题

2023-02-23 14:32:35 浏览数 (2)

欢迎阅读测试开发干货文章:

开始正文:---------

selenium是通过webdriver操作目标来实现ui自动化脚本。

但一直有个问题很让人头疼,那就是各种随机不可预测的弹窗广告的出现,这种广告出现后需要点击一下x 或按钮等才能关掉,如果不关掉,则后续脚本无法正常运行,直接导致所有用例失败。今天就来分享几个解决方案

1. 有不少同学可能会在广告经常出现的页面脚本代码中,设置一个try,当该页面脚本突然无法运行下去的时候,就会认为是弹窗出现,然后在except中直接放上关闭弹窗的代码,然后关闭之后重跑该用例。其实这样做也是确实可以解决一下问题,如果毕竟有堵的成分且不够优雅,或者不是特别的靠谱。但不可否认这是最容易实现和想到的方案。

2. 设置子线程进行巡逻,主线程该跑脚本跑脚本。子线程负责进行环境维护,出现弹窗就关掉仅此而已。当然子线程可以继续扩展,比如发现弹窗后截图,简单判断一下记录一下再关掉。除此之外,子线程还可以帮主线程的脚本运行提供其他各种辅助作用,相当于你的游戏角色大c下副本,带了一个奶妈,肯定是事半功倍。

那么子线程进行巡逻,自然不能跟主线程共用一个driver对象,否则这个driver就变成了既要同时执行用例脚本,又要无时无刻的去盯着随机弹窗广告,那会极大拖慢执行速度。所以子线程就可以选择再启动一个driver对象的方式。那此刻问题又来了:新的driver能控制主线程driver的浏览器么?正常情况下是不能控制的。除非按照下面思路进行设置:

1. 用命令启动浏览器,启动的时候要带上端口,只有命令启动,才可以添加端口参数。

2. 脚本开头创建启动项options,然后添加debugaddress,并设置为127.0.0.1:之前的端口,这样会让driver不新建浏览器,而是直接接着你命令启动的浏览器进行操作。

3. 用thread库创建一个线程,内容就是新建一个driver实例作为子线程,用来辅助,也就是里面用一个when True来在整脚本生命周期内 无时无刻的去检查弹窗广告,一旦检查到,才去瞬间关闭,亲测好用。

4. 你的主线该怎么运行就怎么运行,完全不用担心弹窗的事了,当然双线程,并且有个辅助线程一直在不断的监控,这样确实会更耗费系统资源。所以建议封装成对应的类,并且增加可控的创建和结束功能,在适当的情况下比如广告容易出现的用例执行时开启即可。结束的条件也可以多样化,比如点击几次广告后,该辅助线程就自动关闭。

最后奉上子线程控制同浏览器demo代码:

代码语言:javascript复制
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:6789")  #手动命令启动浏览器需要设置端口未6789 :  --remote-debugging-port=6789
import threading

def a():
    driver = webdriver.Chrome(options=options)
    while True:
        try:
            driver.find_element(By.ID,'弹窗关闭的id').click()
            driver.switch_to.alert.accept()
        except:
            pass
        time.sleep(1) # 扫描监控时间
        # 退出驱动条件自行设计
        driver.quit()

t1 = threading.Thread(target=a)
t1.setDaemon(True) #守护线程,这样主脚本结束后 该线程也会结束。
t1.start()

 # 此处你可以正常写你的主线程的 脚本了
driver = webdriver.Chrome(options=options)
driver.get('')
...
uml

0 人点赞