【问题标题】:Handling "Authentication Required" alert box with Python 2.7 + Selenium Webdriver使用 Python 2.7 + Selenium Webdriver 处理“需要身份验证”警报框
【发布时间】:2015-02-04 00:50:50
【问题描述】:

我在使用安全 URL 时遇到问题:

打开 URL 会创建一个带有用户名和密码字段的“需要身份验证”警报框。

我对 Selenium Webdriver 和 Python 还很陌生。我不熟悉处理警报,目前正在手动输入凭据,直到我弄明白为止。 我已经尝试将我的用户名/密码添加到 URL 中。这对我不起作用。

有人可以指点我在警报框中的用户名和密码字段中输入密钥的方向吗?

【问题讨论】:

  • 能否提供警报截图?
  • 从您的开发人员那里了解这是使用什么形式的身份验证。在 URL 中传递用户名:密码应该在大多数情况下都有效,除非您的语法错误。

标签: python selenium selenium-webdriver


【解决方案1】:

您可以尝试使用Keys 在警报中添加标签吗?

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get('http://www.url.com/')
wait(driver, 5).until(EC.alert_is_present())
alert = driver.switch_to_alert()
alert.send_keys('username')
alert.send_keys(Keys.TAB)
alert.send_keys('password')
alert.accept()

【讨论】:

  • 行:'driver.get('url.com/')' 将有效阻塞,此方法不起作用。
  • 使用连接字符串解决了我这边的问题:alert.send_keys('username' + Keys.TAB + 'password')
  • 这是唯一对我有用的解决方案,但正如@random_clyde 所提到的,我不得不一次性发送密钥
【解决方案2】:

在这种情况下,您需要在访问页面时将用户名和密码传递给服务器,以避免身份验证窗口(这是 selenium 无法访问的)

假设您尝试访问的网址是:http://example.com

您必须使用以下凭据访问此网址:

driver.get('http://username:password@example.com')

username 是您的用户名,password 是您的网站密码。

【讨论】:

  • 我用 Chrome 驱动测试过,页面没有加载。
  • 这不起作用。 Selenium/Firefox/Chrome 删除用户名/密码,然后提示您警报。
  • 这对我有用。感谢@Alpha 的解决方案!
【解决方案3】:

感谢所有回复。不幸的是,这些解决方案都不适合我。我怀疑这可能与每次 webdriver 打开 firefox 时创建新配置文件有关。

我的解决方法: 在安装 32 位 IE 驱动程序 (http://selenium-release.storage.googleapis.com/index.html?path=2.44/) 后,我将驱动程序从 Firefox 更改为 IE。这通过不再创建警报框解决了我的问题,并允许我继续进行单元测试。

【讨论】:

  • 我的密码中有一个@-sign,所以这也是我的解决方案。更不用说使用纯文本密码获取的 http 可能会被嗅探
【解决方案4】:

我遇到了类似的问题,将我的用户名/密码添加到 URL 中对我不起作用。这是因为 Firefox 用一个确认框提醒我,要求我确认我想使用提供的用户名登录网站。以下解决了这个问题:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://<username>:<password>@<site-needing-auth>.com')
alert = driver.switch_to_alert()
alert.accept()

【讨论】:

    【解决方案5】:

    之前的答案对我的情况没有任何帮助。我正在验证的网站使用单点登录,在使用 username:password@website.com 时会出现问题。

    在“身份验证”窗口中,需要输入用户名和密码两个字段。

    要解决此问题,请将用户名和密码一次性发送到警报框。

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.common.alert import Alert
    
    def login(self):
        self.browser = webdriver.Firefox()
        self.browser.get(r'websitelogin.com')
        wait(self.browser, 1).until(expected_conditions.alert_is_present())
    
        # "Switch" to the Alert browser
        alert = Alert(self.browser)
    
        # Send the username, TAB then password all in one go using a python f string
        alert.send_keys(f'username{Keys.TAB}password')
        alert.accept()
    

    【讨论】:

    • 嘿,你在哪里调用这个函数?你传递给这个函数的参数是什么?我需要同样的解决方案。
    • 您需要先调用此函数,因为它会设置 webdriver 并转到站点。在此函数中没有要专门设置的参数,但您需要针对您的特定用例更新websitelogin.comusernamepassword。有道理?大约 2 年前我这样做的时候,它只适用于 Firefox 网络驱动程序。不过,现在情况可能已经改变了。
    【解决方案6】:

    在我注意到之前,我遇到了与您完全相同的问题,我只是忘记写:'https' 而不仅仅是 http。如果您添加“s”,对我来说就是这样做的!

    所以在代码中也许你想尝试一下:

    driver.get('https://username:password@domain-name.org')
    

    【讨论】:

      【解决方案7】:

      下面的 Python 代码可以帮助在 JavaScript 弹出警报中加载这样的 URL 提示进行身份验证,我也在这里停留了很长时间。这是因为 Chrome 驱动程序在更新 59 之后(可能)将不允许此类身份验证技术。仍然存在通过 Selenium 使用浏览器中的 JavaScript 引擎加载此类 URL 的后门。

      driver.get("https://www.google.com")
      URL = "https://{username}:{password}@www.example.com"
      driver.executeScript("window.open('"+URL+"')")
      

      【讨论】:

        猜你喜欢
        • 2015-07-26
        • 2017-07-10
        • 2013-10-18
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        • 2016-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多