作为自动化的一部分,我正在尝试使用Selenium登录本地托管的网站。该页面提供 HTTP 基本身份验证弹出窗口,我使用以下代码发送凭据。但是,在使用调试器并逐步执行代码时,我破译了 TimeOut 异常反复发生(在旁边标有注释的行(。
详
- 我尝试使用Chrome浏览器及其相应的chrome WebDriver,适用于从79.0到最新的84.0的所有版本,但此异常似乎在所有情况下都发生。
- OS - Windows Server W2k12 VM。[在Windows 10上也试用过]
- 蟒蛇版本 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('domainusername' + Keys.TAB + 'password')
alert.accept()
time.sleep(5)
注:
- 由于内部页面中的错误,我无法使用
https://username:password@ipaddress:port
格式通过URL发送凭据,因此这迫使我求助于将上述硒方法作为我唯一的选择。 - 火狐的相应代码运行良好(对于同一目标内部网站(
可能的预感
我想知道,新创建的虚拟机上是否缺少任何软件包,这对于 chrome WebDriver 的工作至关重要。例如,Firefox Gecko驱动程序需要Visual studio可再发行组件才能工作。Chrome WebDriver 是否需要任何此类等效软件包?
我不相信基本身份验证弹出窗口在ChromeDriver中显示为"警报",因此AFAIK您唯一的选择是https://username:password@ipaddress:port
。有趣的是,您说您可以对Firefox中的弹出窗口进行编程。
在Chrome 78之前,身份验证弹出窗口将显示并阻止测试脚本,您必须"手动"输入凭据(或使用更通用的"桌面窗口操作"API(,但我认为这不再有效。
这里最终有效的是放弃使用 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 install pywin32
之前(
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}")