当前位置: 首页 > 知识库问答 >
问题:

在脚本使用Selenium Python Chrome切换到警报之前,警报将消失

唐向荣
2023-03-14

我正在编写一个Python(3.6.6)脚本,它使用Selenium(3.141.0)在Chrome(ChromeDriver版本77.0.3865.40)中打开一个网址,导航一系列菜单,在弹出窗口中输入登录详细信息并登录。这是我的剧本:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

url = 'https://some.url.com/'

driver = webdriver.Chrome()
action = ActionChains(driver)
driver.get(url)

button_1 = driver.find_element_by_xpath("//*[contains(text(), 'button_1_text')]")
button_1.click()

button_2 = driver.find_element_by_id('button_2_text')
button_2 .click()

link = driver.find_element_by_link_text('link_text')
action.move_to_element(link).perform()
link.click()

alert_obj = driver.switch_to.alert

如果我手动执行此导航,我会得到一个提示,询问用户名和密码,并有两个按钮用于登录或取消。当Selenium执行此操作时,我看到提示闪烁,但随后很快消失,因此我得到错误:

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

如果手动刷新仍然打开的浏览器,则可以显示警报,但如果编写刷新脚本,则提示再次消失。我尝试过等待警报出现,如使用selenium和python检查是否存在警报中所述,但等待只是超时。

如果我检查了警报消失后保持打开状态的页面的源代码,我会看到:

<!-- template name: form.autopost.template.html -->

<html>
    <head>
    <title>Submit Form</title>
    </head>
    <body onload="javascript:document.forms[0].submit()">
       <noscript>
            <p>
                <strong>Note:</strong> Since your browser does not support JavaScript, you must press the Resume button once to proceed.
            </p>
        </noscript>
        <form method="post" action="another_url.saml2">
                        <input type="hidden" name="SAMLRequest" value="really_long_token"/>
                        <input type="hidden" name="RelayState" value="token"/>
                        <noscript><input type="submit" value="Resume"/></noscript>
        </form>
    </body>
</html>

因此,我尝试通过以下方式显式启用JavaScript:

options = webdriver.ChromeOptions()
options.add_argument("--enable-javascript")
driver = webdriver.Chrome(chrome_options=options)

这似乎类似于Selenium test-Firefox警报立即消失,但看起来我无法使用Chrome重新创建解决方案。我尝试了以下方法:

options = webdriver.ChromeOptions()
options.add_argument("--disable-popup-blocking")
driver = webdriver.Chrome(chrome_options=options)

但这也没什么区别。还有其他方法可以防止Selenium/Chrome自动关闭警报吗?

以下是弹出窗口的屏幕截图:

我已尝试在脚本末尾添加以下内容:

current_url = driver.current_url
parts = current_url.split('//')
login_url = parts[0] + '//{}:{}@'.format(username, password) + parts[1]
driver.get(login_url)

但这没用。登录URL如下所示:

https://用户名:password@some_site/1S14/idp/G6tue/简历/idp/prp.ping?pfidpadapterid=idp.CG2LlmzHFUrah4EmDQ7jO_XTLGP

共有2个答案

华升
2023-03-14

如果你得到的提示是浏览器登录,那么你可以尝试这样设置用户名和密码:

driver.get("https://username:password@somewebsite.com/")

如本文所述,Selenium Python在HTTPS网站上验证浏览器登录pupup对话框

但是这不是一个警报,这就是为什么你不能用driver.switch_to.alert来处理它,你会得到异常。

濮阳原
2023-03-14

我已经为我的公司做了一个类似的项目,您需要做的是使用UI自动化(Lib:pyautogui)浏览到该URL,然后输入用户名和密码。之后,您可以自由使用Selenium做任何事情。

您的代码不会超出driver.get(url),它将永远停留在那里。

 类似资料:
  • 如何将以下警报转换为ESLint可接受的警报? 我的构建失败,因为显然我不能使用"警报"。我想在加载某个东西时调用此警报。此代码工作成功,但不符合ESLint。 http://eslint.org/docs/rules/no-alert 如何修改代码使其成功构建? 提前感谢:)

  • 我试图在。ics文件中实现警报()。其思想是,每当在系统中创建指定的记录时,就会发送带有邀请的自动电子邮件。该事件工作正常,它正在发送,我能够添加到日历(谷歌日历和iPhone/Mac日历)。 所以问题是:是谷歌和苹果忽视了这些VALARM组件,还是我做错了什么? 我是否正确理解这个带有动作的警报应该只是在浏览器(谷歌日历)和日历应用程序中向我显示一个弹出窗口? 我的文件正文: null

  • Logstash 中有两个 output 插件是 nagios 有关的。outputs/nagios 插件发送数据给本机的 nagios.cmd 管道命令文件,outputs/nagios_nsca 插件则是 调用 send_nsca 命令以 NSCA 协议格式把数据发送给 nagios 服务器(远端或者本地皆可)。 Nagios.Cmd nagios.cmd 是 nagios 服务器的核心组件。

  • 在我的代码中,我创建了一个警报,如下所示: 要取消警报,我执行以下操作: 移除任何具有匹配意图的警报。任何类型的警报,其意图与此警报匹配(由filterEquals(Intent)定义),都将被取消。 我不太确定“匹配意图”的定义是什么。如果我用上面的代码创建多个警报,然后按照显示的方式执行取消,它会取消我创建的所有警报吗?

  • 问题内容: 我正在编写Java客户端(在weblogic 10.3上)以调用安全的Web服务。我已获得安装在cacerts,DemoIdentity.jks和DemoTrust,jks中的客户端证书。在我的Weblogic中,我已将密钥库设置为DemoIdentity和DemoTrust。在weblogic控制台中,我已将“双向客户端证书行为:”设置为“已请求但未强制执行的客户端证书”。对于“启用

  • 本章将讨论警报和Bootstrap为警报提供的类。 警报提供了一种为用户设置消息样式的方法。 它们为典型的用户操作提供上下文反馈消息。 您可以添加可选的关闭图标以发出警报。 对于内联解雇,请使用Alerts jQuery插件 。 您可以通过创建包装器并添加.alert类和四个上下文类之一(例如, .alert-success, .alert-info, .alert-warning, .alert