gpt4 book ai didi

python + Selenium webdriver : using authenticate method

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:24 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com