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

Selenium使用Chrome浏览器-HTTP基本身份验证期间超时[Python]

陶树
2023-03-14

作为自动化的一部分,我正在尝试使用selenium登录本地托管的网站。该页面提供HTTP基本身份验证弹出窗口,我使用下面的代码发送凭据。然而,在使用调试器并逐步执行代码时,我发现超时异常会反复出现(在旁边标有注释的行)。

  • 我在Chrome浏览器及其相应的Chrome WebDriver上尝试了从79.0到最新的84.0的所有版本,但这种例外似乎在所有情况下都会发生
  • Windows服务器W2k12虚拟机。[也在Windows 10上试用过]
  • Python 3.8版
import time
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys

options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ignore-ssl-errors')
driver = webdriver.Chrome(chrome_options=options)
driver.maximize_window()
driver.get(url)
wait = WebDriverWait(driver, 10)
alert = wait.until(EC.alert_is_present()) # This line causes the time out exception
alert = driver.switch_to.alert
alert.send_keys('domain\username' + Keys.TAB + 'password')
alert.accept()
time.sleep(5)

注:

  1. 由于内部页面中存在错误,我无法使用https://username:password@ipaddress:port格式,因此这迫使我将上述selenium方法作为唯一的选择
  2. firefox的相应代码运行良好(针对同一目标内部网站)

我想知道,新创建的虚拟机上是否缺少任何软件包,这对chrome WebDriver的工作至关重要。例如,Firefox Gecko驱动程序需要Visual studio可再发行文件才能工作。chrome WebDriver是否需要任何类似的软件包?

共有2个答案

蓝宜
2023-03-14

这里的工作最终是放弃使用Selenium方式使用send_keys()方法,而是使用其他包来完成这项工作。以下两个片段起作用了。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import keyboard
​
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ignore-ssl-errors')
driver = webdriver.Chrome(r"path_to_chromedriver.exe", options=options)
driver.maximize_window()
driver.get("<replace with url>")
​
keyboard.write(r"<replace with username>")
keyboard.press_and_release("tab")
keyboard.write("<replace with password>")
keyboard.press_and_release("tab")
keyboard.press_and_release("enter")

或者这个(pip安装pywin32before)

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import win32com.client 
​
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ignore-ssl-errors')
driver = webdriver.Chrome(r"path_to_chromedriver.exe", options=options)
driver.maximize_window()
driver.get("<replace with url>")
​
shell = win32com.client.Dispatch("WScript.Shell")  
shell.SendKeys(r"<replace with username>")
shell.SendKeys("{TAB}")
shell.SendKeys("<replace with password>")
shell.SendKeys("{TAB}")
潘振国
2023-03-14

我不认为ChromeDriver中的基本身份验证弹出窗口是作为“警报”公开的,所以您唯一的选择是https://username:password@IP地址:端口。有趣的是,你说你可以在Firefox中编程到弹出窗口。

直到Chrome78,身份验证弹出窗口将显示并阻止测试脚本,您必须手动输入凭据(或使用更通用的桌面窗口操作应用编程接口),但我认为这不再有效。

 类似资料:
  • 问题内容: 有谁知道在自动化过程中使用Selenium或任何其他工具来处理浏览器身份验证吗? 问题答案: 警报方法authenticateUsing() 使您可以跳过“ Http基本身份验证”框。 从Selenium 3.4开始,它仍处于测试阶段 现在,仅针对 InternetExplorerDriver

  • 在浏览器中直接键入下面的url,它可以工作, 但是,当我使用相同的url,用于selenium网络驱动程序测试时,它连接到 以及请求HTTP身份验证。我是否需要更改chrome浏览器中的任何设置,或调整默认配置文件?

  • 我尝试了angular.js,并从一个restful api的web-ui开始(使用超文本传输协议基本授权)。这真的很好,除了授权工作。 到目前为止,我使用的是设置密码,但大多数情况下浏览器会打开http basic auth的默认登录表单。另一个奇怪的行为是angular请求不包含授权头(选项和GET请求都不包含)。我还尝试使用header配置在每个请求上设置此header,但这也不起作用。 有

  • 问题内容: 如何在Golang网站上实施基本身份验证?这样,当有人访问某个页面时,他们的 浏览器 会提示他们登录。 问题答案: 为了强制用户进行身份验证/在用户浏览器中显示基本身份验证提示,请发送标头 因此,如果您有通话,您可以 这将导致浏览器打开您所指的提示。

  • 问题内容: 以下代码成功连接到我的Ruby on Rails API,并使用AFNetworking返回JSON。我需要做什么来进行编辑以传递用户名和密码,以便我的API可以使用HTTP基本身份验证? 我已经阅读了他们的文档,但是我对Objective-C和AFNetworking还是陌生的,目前还没有意义。 问题答案: AFNetworking 2.x的答案已更新 对于AFNetworking

  • 问题内容: 我正在尝试使用Google Chrome浏览器进行selenium测试。我想使用HTTP基本身份验证登录。在Selenium中未实现,因此建议加载扩展。我正在使用来自的代码 https://github.com/RobinDev/Selenium-Chrome-HTTP-Private- Proxy, 以及“如何使用chrome驱动程序使用Java覆盖selenium2中的基本身份验证