Python Selenium警报身份验证麻烦

时间:2017-03-01 21:40:42

标签: python-2.7 selenium authentication alert

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

enter image description here

我试图查找许多不同的方法来做到这一点,他们似乎没有工作。我试过的内容如下:

  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")
    
  4. 我必须使用Chrome,因为我拥有的IE和Firefox版本可以获得,不支持网站中的功能

2 个答案:

答案 0 :(得分:0)

  

这是Pythoncode
  警报框的问题(特别是甜蜜警报是他们有一个   延迟和Selenium太快了)

对我有用的选项是:(只需用你想要的任何动作交换按钮点击)

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

答案 1 :(得分:0)

我遇到这个完全相同的问题已经有一段时间了 - 我的最终目标是headless(在后台不直观地启动 Chromedriver 实例)。

非理想解决方案 1: 我首先使用了一个名为 pynput 的库来自动在警告框中输入凭据并单击确定按钮,工作起来非常简单,但是:

  • 仍然没有无脑地工作
  • 我必须专注于浏览器,否则它会在其他地方输入凭据

在此期间这很有效,因为我在网上看到的任何地方似乎我都无能为力地克服身份验证警报......

我是一个相对初学者(<1 年前开始编程)所以也许我只是没有找对地方!

我现在已经解决了这个问题:

首先,我在 Chrome 上正常登录警报,同时监视 devtools 的网络部分,以仔细查看受保护页面 screencap here 的 GET 请求:

在看到授权是基本的(这也适用于承载者)后,我测试了在 Postman 中使用此标头复制相同的请求,并且成功了!现在如果只有一种方法可以从 Selenium 发出 http 请求???

我首先尝试了库 selenium-requests(这对我不起作用:我遇到了与此人相同的错误 https://github.com/cryzed/Selenium-Requests/issues/33 这个库看起来非常好,正是我所需要的,我只是目前不知道如何通过防火墙/在这个阶段阻止我的任何东西......

最终对我有用的是图书馆 selenium-wire。我按照本指南 https://pypi.org/project/selenium-wire/#intercepting-requests-and-responses 让 webdriver 像往常一样导航到受保护的页面,但在发送之前拦截请求并添加授权标头:) 现在这对我来说完全没有头。当然,这不适用于更安全的网站,但我希望它可以帮助遇到相同问题的人。