Python Selenium 警报身份验证问题

Python Selenium Alert Authentication Trouble

我正在尝试访问需要通过警告框登录的网站,如下所示:

我已经尝试查找许多不同的方法来执行此操作,但它们似乎都不起作用。下面列出了我尝试过的方法:

  1. 没有用,给我同样的登录提示。

    start_url = 'http://username:password@example.com'
    agent.get(start_url)
    
  2. 不断收到错误消息 "NoAlertPresentException: Message: no alert open"

    start_url = 'http://www.example.com'
    alert = agent.switch_to_alert()
    alert.send_keys("username")
    alert.send_keys("password")
    
  3. 得到一个错误说 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 :) 现在这对我完全有效无头。当然,这在更安全的网站上不起作用,但我希望它能帮助遇到同样问题的人。