Python Selenium 警报身份验证问题
Python Selenium Alert Authentication Trouble
我正在尝试访问需要通过警告框登录的网站,如下所示:
我已经尝试查找许多不同的方法来执行此操作,但它们似乎都不起作用。下面列出了我尝试过的方法:
没有用,给我同样的登录提示。
start_url = 'http://username:password@example.com'
agent.get(start_url)
不断收到错误消息 "NoAlertPresentException: Message: no alert open"
start_url = 'http://www.example.com'
alert = agent.switch_to_alert()
alert.send_keys("username")
alert.send_keys("password")
得到一个错误说 webdriver 没有属性 "switchTo"
start_url = 'http://www.example.com'
agent.switchTo().alert().sendKeys("username")
我不得不使用Chrome因为我拥有的IE和Firefox的版本不支持本站的功能
This is Pythoncode
Problem with alert boxes (especially sweet-alerts is that they have a
delay and Selenium is pretty much too fast)
一个对我有用的选项是:(只需将最后的按钮点击换成你想要的任何动作)
while True:
try:
driver.find_element_by_xpath('//div[@class="sweet-alert showSweetAlert visible"]')
break
except:
wait = WebDriverWait(driver, 1000)
confirm_button = driver.find_element_by_xpath('//button[@class="confirm"]')
confirm_button.click()
注2:这可能是由于加载警报比单个元素(例如用户名等)花费更多时间加载导致的错误
注意3.:我觉得应该是switch_to
一段时间以来我一直遇到这个完全相同的问题 - 我的最终目标是做到这一点 headless(在后台没有视觉启动 [=54 的实例=]driver).
Non-Ideal解决方案1:
我首先使用了一个名为 pynput 的库来自动将凭据输入到警告框中并单击确定按钮,开始工作非常简单但是:
- 还是没干活
- 我必须专注于浏览器,否则它会在其他地方输入凭据
与此同时,这非常有效,因为我在网上查看的所有地方似乎都无能为力地克服身份验证警报...
我是一个相对初学者(<1 年前开始编程)所以也许我没有找对地方!
我现在已经解决了这个问题:
首先,我在 Chrome 上正常登录警报,同时监视 devtools 的网络部分,以仔细查看受保护页面的 GET 请求 screencap here:
看到授权是基本的(这也适用于 Bearer)后,我测试了使用此 header 在 Postman 中复制相同的请求并且成功了!现在要是有办法从 Selenium 发出 http 请求就好了???
我首先尝试了库 selenium-requests(这对我不起作用:我遇到了与此人相同的错误 https://github.com/cryzed/Selenium-Requests/issues/33
这个库看起来非常好,正是我所需要的,我只是目前没有 know-how 来克服 firewalls/whatever 在这个阶段阻止我...
最终对我有用的是图书馆selenium-wire。我按照本指南 https://pypi.org/project/selenium-wire/#intercepting-requests-and-responses 让 webdriver 正常导航到受保护的页面,但拦截请求并在发送之前添加授权 header :) 现在这对我完全有效无头。当然,这在更安全的网站上不起作用,但我希望它能帮助遇到同样问题的人。
我正在尝试访问需要通过警告框登录的网站,如下所示:
我已经尝试查找许多不同的方法来执行此操作,但它们似乎都不起作用。下面列出了我尝试过的方法:
没有用,给我同样的登录提示。
start_url = 'http://username:password@example.com' agent.get(start_url)
不断收到错误消息 "NoAlertPresentException: Message: no alert open"
start_url = 'http://www.example.com' alert = agent.switch_to_alert() alert.send_keys("username") alert.send_keys("password")
得到一个错误说 webdriver 没有属性 "switchTo"
start_url = 'http://www.example.com' agent.switchTo().alert().sendKeys("username")
我不得不使用Chrome因为我拥有的IE和Firefox的版本不支持本站的功能
This is Pythoncode
Problem with alert boxes (especially sweet-alerts is that they have a delay and Selenium is pretty much too fast)
一个对我有用的选项是:(只需将最后的按钮点击换成你想要的任何动作)
while True:
try:
driver.find_element_by_xpath('//div[@class="sweet-alert showSweetAlert visible"]')
break
except:
wait = WebDriverWait(driver, 1000)
confirm_button = driver.find_element_by_xpath('//button[@class="confirm"]')
confirm_button.click()
注2:这可能是由于加载警报比单个元素(例如用户名等)花费更多时间加载导致的错误 注意3.:我觉得应该是switch_to
一段时间以来我一直遇到这个完全相同的问题 - 我的最终目标是做到这一点 headless(在后台没有视觉启动 [=54 的实例=]driver).
Non-Ideal解决方案1: 我首先使用了一个名为 pynput 的库来自动将凭据输入到警告框中并单击确定按钮,开始工作非常简单但是:
- 还是没干活
- 我必须专注于浏览器,否则它会在其他地方输入凭据
与此同时,这非常有效,因为我在网上查看的所有地方似乎都无能为力地克服身份验证警报...
我是一个相对初学者(<1 年前开始编程)所以也许我没有找对地方!
我现在已经解决了这个问题:
首先,我在 Chrome 上正常登录警报,同时监视 devtools 的网络部分,以仔细查看受保护页面的 GET 请求 screencap here:
看到授权是基本的(这也适用于 Bearer)后,我测试了使用此 header 在 Postman 中复制相同的请求并且成功了!现在要是有办法从 Selenium 发出 http 请求就好了???
我首先尝试了库 selenium-requests(这对我不起作用:我遇到了与此人相同的错误 https://github.com/cryzed/Selenium-Requests/issues/33 这个库看起来非常好,正是我所需要的,我只是目前没有 know-how 来克服 firewalls/whatever 在这个阶段阻止我...
最终对我有用的是图书馆selenium-wire。我按照本指南 https://pypi.org/project/selenium-wire/#intercepting-requests-and-responses 让 webdriver 正常导航到受保护的页面,但拦截请求并在发送之前添加授权 header :) 现在这对我完全有效无头。当然,这在更安全的网站上不起作用,但我希望它能帮助遇到同样问题的人。