作者:以后再试巛_113 | 来源:互联网 | 2023-10-12 15:05
窃听,单击类似于的链接
它将打开一个新的弹出窗口,其中包含登录名/密码字段(确定/取消按钮).
然后网络驱动程序出于某种原因将其确定为警报而不是窗口…
如果尝试
用于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