热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SeleniumWebdriver:确定为警报的窗口(HTTP基本访问身份验证),如何登录(Python)

窃听,单击类似于的链接它将打开一个新的弹出窗口,其中包含登录名密码字段(确定取消按钮).然后网络驱动程序出于某种原因将其确定为警报而不是窗

窃听,单击类似于的链接
它将打开一个新的弹出窗口,其中包含登录名/密码字段(确定/取消按钮).
然后网络驱动程序出于某种原因将其确定为警报而不是窗口…

如果尝试

用于browser.window_handles中的句柄:
 打印(句柄)

它是返回异常:UnexpectedAlertPresentException:警报文本:消息:存在模态对话框

如果尝试

alert = browser.switch_to_alert()
alert.send_keys(‘userlogin’)

它正在工作(将用户登录名插入第一个字段).
然后,如果尝试通过TAB键将光标移动到下一个字段(密码)

alert.send_keys(Keys.TAB)

它是将第一个字段的文本替换为项目符号,而不是跳至下一个字段…

不仅TAB甚至ENTER都以相同的方式工作

alert.send_keys(Keys.ENTER)

它粘贴了相同的项目符号,而不是向服务器发送请求

alert.accept()

什么都不做(不向服务器发送请求)

在这里可以做什么?

>这是一个警报,因此find_element_by _…方法不适用.
> send_keys的TAB无效(无制表符).
>唯一按坐标单击的解决方案(使用pyautogui模块作为选项)吗?
>还是可以使用webdriver做更多的事情?

使用IE(IEDriverServer)的BTW

还有一些寻找紧密的问题

> 31152912个关闭的问题,但答案是关于find_element_by_name的(“ Alert”对象没有此类属性)
> 31152912,29516740,27322871回答有关使用’http://username:password@‘的问题,很遗憾,它无法正常工作

以.htaccess密码保护的登录形式为例(advancedhtml.co.uk/password.html)

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser=webdriver.Ie('c:\\...\\IEDriverServer.exe')
page='http://www.advancedhtml.co.uk/password/'
browser.get(page)
alert=browser.switch_to_alert()
#alert=browser.switch_to.alert() # this should work, but it doesn't: TypeError: 'Alert' object is not callable
alert.send_keys('user')
alert.send_keys(Keys.TAB) # no tabbing, bullet symbol instead...
#alert.send_keys('password')

解决方法:

因此,这种登录页面是HTTP基本访问身份验证.看起来处理这种身份验证的最佳方法是发送发布请求(请求包)

需要将浏览器会话从Selenium传递到请求
(29563335)

代码可能看起来像这样:

from selenium import webdriver
import requests
startURL='http://some_url'
browser=webdriver.Ie('c:\\path\\IEDriverServer.exe')
browser.get(startURL)
# an example of finding login link and get the url
loginLink=browser.find_element_by_xpath("//*[contains(text(), 'Log In')]")
loginURL=loginLink.get_attribute('href')
# load COOKIEs from Selenium to Requests (so we could authenticate in current session)
COOKIEs=browser.get_COOKIEs()
s=requests.Session()
for COOKIE in COOKIEs:
s.COOKIEs.set(COOKIE['name'], COOKIE['value'])
# and send the post request
auth=('login', 'password')
r=s.post(url=loginURL, auth=auth)
browser.refresh() # refresh page to see the result


推荐阅读
author-avatar
以后再试巛_113
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有