python + Selenium webdriver : using authenticate method

标签 python selenium webdriver http-authentication

我正在使用 python + selenium webdriver 来自动化检查。 我被困在通过弹出窗口请求 http 身份验证的网站上。

我正在尝试通过以下代码使用“身份验证”方法:

#init.
driver = webdriver.Firefox()
driver.get(url)
#get to the auth popup window by clicking relevant link
elem = driver.find_element_by_id("login_link")
elem.click()
#use authenticate alert method
driver._switch_to.alert.authenticate("login", "password")

与此方法相关的(稀缺)信息/文档表明它应该提交提供的凭据并验证 http 身份验证。它没有,我收到以下错误:

File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/common/alert.py", line 105, in authenticate self.driver.execute(Command.SET_ALERT_CREDENTIALS, {'username':username, 'password':password}) File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 201, in execute self.error_handler.check_response(response) File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 159, in check_response raise exception_class(value) selenium.common.exceptions.WebDriverException: Message: Unrecognized command: POST /session/c30d03e1-3835-42f5-ace0-968aef486b36/alert/credentials

我在这里遗漏了什么/有没有人遇到同样的问题并解决了它?

附言:http://username:password@url在我的测试条件下,技巧对我不起作用。

最佳答案

Basic authentication自动化测试非常容易解决,无需处理 native 警报/对话框或其他浏览器差异。

我在 Java 世界中非常成功地使用的方法是设置一个 Browsermob在代码中代理服务器并注册一个 RequestInterceptor 来拦截所有传入的请求(匹配所讨论的主机/URL 模式)。当您有一个需要基本身份验证的请求时,add an Authorization 带有所需凭据的 HTTP header ('Basic' + Base64 编码的'user:pass' 字符串。因此对于'foo:bar',您将设置值 Basic Zm9vOmJhcg== )

启动服务器,将其设置为网络代理for Selenium traffic , 当请求需要认证时,proxy 会添加 header,浏览器会看到它,验证凭据,而不需要弹出对话框。

尽管该技术可能看起来很费力,但通过为每个请求自动设置 header ,您不必将 user:pass@ 显式添加到 任何 URL可能需要它,那里有多种方式进入授权区域。此外,与 user:pass@ 用户不同,您不必担心浏览器缓存(或在一定时间后停止缓存) header ,或跨越 HTTP/HTTPS。

该技术非常有效,但如何在 Python 中实现这一点?

你可以使用这个 Python wrapper for Browsermob ,它在 Python 中公开了它的 REST API。这是您需要的 REST 调用:

POST /proxy/[port]/headers - Set and override HTTP Request headers. For example setting a custom User-Agent. Payload data should be json encoded set of headers (not url-encoded)

因此,根据前面的示例(伪代码):

POST localhost:8787/proxy/<proxy_port>/headers '{"Authorization": "Basic Zm9vOmJhcg=="}'

或者,您可以 see this answer用于使用 Twisted 的自定义 Python 代理服务器。

关于 python + Selenium webdriver : using authenticate method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35004026/

相关文章:

python - iloc 和 loc 有何不同?

ajax - 您如何使用 Selenium 测试 Ajax 应用程序并使其保持稳定?

java - 使用 Webdriver 接受不受信任的 SSL 证书,用于单击菜单选项时打开的窗口

java - WebDriver 资源管理器菜单滚动

firefox - 在 Linux 上的 Jenkins 下运行的 WebDriver 测试中出现 NotConnectedException 错误

python - 在 Django Rest Framework 中访问 View 集中的请求对象和序列化程序?

Python3 子进程模块 : Passing an empty variable as a flag, 可能吗?

python - Django 部署在 Alwaysdata 上

java - 如何在响应式网页中为一行使用单个网页元素

python - WebDriver异常 : Message: newSession with GeckoDriver Firefox v65 and Selenium through Python 3. 7