Python+Selenium 如何优雅地处理出现未知次数的弹框?

发布于 2022-09-11 22:43:51 字数 1957 浏览 38 评论 0

问题有了变异,并最终确认是 ChromeDriver 版本不兼容的 bug,我用的版本 76.0.3809.25,同学的是 2.43.600210(正确)。(chrome 77.0.3865.120)
详情见 https://testerhome.com/topics/20940


以下解法为 ChromeDriver 版本不兼容 bug 下的解法,非常不提倡。

<script>alert(1)</script>
<script>prompt(1)</script>
<script>confirm(1)</script>
<a href="https://www.baidu.com" target="_blank">baidu</a>

以上代码中的弹框出现未知次数(0-n),要求出现若干次弹框,最后均能正确返回 driver.find_elements_by_xpath("//a") 的结果

我的尝试 driver.execute_script('window.alert=function(str){return;};') 这样重写不能实现目标。

from selenium import webdriver

chromeOptions = webdriver.ChromeOptions()
prefs={"profile.managed_default_content_settings.popups":0}
chromeOptions.add_experimental_option('prefs',prefs)
driver = webdriver.Chrome(chrome_options=chromeOptions)

domain = 'file:///C:/Users/admin/Desktop/popups.html'
driver.get(domain)

这样配置也不能实现目标。

我的处理代码已经跟我一样炸裂,就不发了。
我知道自定义 chromium 能实现禁止弹框,但还不想中途学习 chromium 源码编译。。。

由于在有弹框的时候,在 try 下执行 links = driver.find_elements_by_xpath("//a"),会报错

selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: 1

同时弹框自动消失,若此时执行 driver.switch_to.alert.accept(),会触发不存在弹框的错误:

selenium.common.exceptions.NoAlertPresentException: Message: no such alert

所以我决定不对弹框进行操作,并不优雅的解决方案如下:

from selenium import webdriver

driver = webdriver.Chrome()
domain = 'file:///C:/Users/admin/Desktop/popups.html'
driver.get(domain)

for i in range(0,5):#允许弹框出现的次数,一直循环的直接放弃
    try:
        links = driver.find_elements_by_xpath("//a")
        break
    except Exception as e:
        if 'alert' in str(e):
            pass
        else:
            links = []
            break

print(links)

欢迎能用 python 解决的大佬继续解答。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

南…巷孤猫 2022-09-18 22:43:51

请参考代码片段

def find_by_xpath(driver, xpath):
    while True:
        try:
            return driver.find_elements_by_xpath(xpath)
        except UnexpectedAlertPresentException:
            try:
                driver.switchTo().alert().dismiss()
            except NoAlertPresentException:
                pass
            continue


links = find_by_xpath(driver, "//a")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文