使用ActionChains的send_keys无法在Basic Auth页面输入值的问题
解决Basic Auth输入无效的问题
问题根源
你遇到的输入无效,是因为Basic Auth的登录弹窗是浏览器原生对话框,不属于网页DOM结构,Selenium的ActionChains仅用于操作网页内元素,对这种浏览器级别的弹窗完全无效,所以你的输入操作根本没作用在弹窗上。
两种可行解决方案
方案1:URL直接携带认证信息(最简便)
把用户名和密码直接拼接在URL里,格式为https://{用户名}:{密码}@{目标地址},浏览器会自动完成认证,无需手动输入。
修改你的setup_method里的get方法即可:
def setup_method(self): self.driver = webdriver.Chrome(executable_path='D:\WORK\PycharmProjects\at\chromedriver.exe') self.driver.implicitly_wait(2) # 直接携带用户名和密码访问 self.driver.get('https://admin:admin@the-internet.herokuapp.com/basic_auth')
这样打开页面后会直接完成认证,后续test_login方法里的输入操作可以全部删掉,直接验证登录成功的元素即可。
方案2:通过Selenium处理原生认证弹窗
针对浏览器原生的Basic Auth弹窗,可以使用Selenium的switch_to.alert结合authenticate方法(注意:部分现代浏览器可能对该方法支持有限,优先推荐方案1)。
修改后的test_login方法示例:
def test_login(self): # 切换到认证弹窗 alert = self.driver.switch_to.alert # 传入用户名和密码完成认证 alert.authenticate('admin', 'admin') # 验证登录成功 self.driver.find_element(By.XPATH, "//div[contains(text(), 'Congratulations!')]")
你的代码里的额外错误
你写的action.send_keys(Keys, "admin")是语法错误,正确写法是action.send_keys("admin"),但即使修正这个错误,因为弹窗是原生的,依然无法解决问题,所以核心还是要换处理原生弹窗的方法。
内容的提问来源于stack exchange,提问作者Polina
相关产品推荐
相关产品推荐

