如何切换到窗口身份验证弹出窗口并输入凭据?

时间:2018-02-16 09:29:39

标签: java python selenium

打开应用程序URL后,用户将被重定向到登录页面,其中有一个登录按钮。

driver.get("abc.com")

现在,当用户点击登录按钮时,URL在同一窗口中更改,表示它变为xyz.com并显示用于登录目的的身份验证弹出窗口,类似于下图所示的图像。 enter image description here

要在身份验证窗口中输入用户名和密码,我尝试了下面的代码

shell = win32com.client.Dispatch("WScript.Shell")
shell.Sendkeys("username")
time.sleep(1)
shell.Sendkeys("{TAB}")
time.sleep(1)
shell.Sendkeys("password") 
time.sleep(1)
shell.Sendkeys("{ENTER}")
time.sleep(1)

它没有用。然后我尝试用上面的代码直接打开Windows身份验证弹出窗口(通过点击登录按钮后复制URL),它工作了

driver.get("xyz.com")//instead of abc.com my application URL
我有点困惑。如果我打开我的应用程序URL abc.com,单击登录按钮,使用autoit,它没有输入凭据。但是,如果我直接发送窗口身份验证URL xyz.com而不是app URL abc.com并使用autoit,它就可以工作。

有谁可以建议我在这里缺少什么?我也尝试在点击Sign-In按钮后切换窗口,然后考虑其新的URL然后自动执行命令,但它仍然无法正常工作。

driver.switch_to_window(driver.window_handles[1])

对此有何想法?

注意:我注意到点击登录按钮,窗口无限加载&光标在Windows身份验证poup的用户名text-field上处于活动状态。此外,一旦出现Windows身份验证窗口,selenium命令都不起作用,也没有自动命令。

7 个答案:

答案 0 :(得分:3)

selenium将对话框视为警报。在c#中,输入Firefox测试凭据的代码如下所示:

// Inputs id with permissions into the Windows Authentication box
var alert = driver.SwitchTo().Alert();
alert.SendKeys( @"username" + Keys.Tab + 
                @"password" + Keys.Tab);
alert.Accept();

第一行告诉驱动程序检查打开警报(对话框)。

第二行将用户名和密码发送到警报

第三行然后发送这些凭证,并且假设它们有效,测试将继续。

假设您正在使用Firefox进行测试,则无需使用额外的框架来处理此身份验证框。

答案 1 :(得分:0)

看起来您只需要使用基本身份验证凭据打开URL。 你能先试试吗?

driver.get('http://username:password@abc.com')

如果您仍然在弹出窗口,请尝试使用

driver.get('http://username:password@xyz.com') #assuming this is the site that handles authentication
driver.get('abc.com')

它应该停止弹出

答案 2 :(得分:0)

同意Aldo的回答。尝试使用https代替http,例如:

driver.get('https://username:password@abc.com')

您可以查看其他方式here

答案 3 :(得分:0)

在此阶段,它不是您自动化的浏览器。您自动执行keyboard

import keyboard
keyboard.write("username")
time.sleep(5)
keyboard.press_and_release("tab")
time.sleep(5)
keyboard.write("password")
time.sleep(5)
keyboard.press_and_release("enter")

通过点击和未命中来调整睡眠时间。

注意:您可能必须使用线程来执行此操作。

仅供参考,这是一个适合我的实际例子。调整以使其更快。我只想测试它是否有效,无论多慢。

from selenium.webdriver.firefox.webdriver import WebDriver
import keyboard
import time

selenium = WebDriver()
selenium.get("somelink")

time.sleep(5)
print "write user"
keyboard.press_and_release('tab')
keyboard.press_and_release('shift + tab')
time.sleep(2)
keyboard.write("user", delay=1)
print "done"
time.sleep(5)
keyboard.press_and_release('tab')
print "pressed tab"
time.sleep(5)
print "write password"
keyboard.write("pass", delay=1)
print "done"
time.sleep(2)
keyboard.press_and_release('enter')
print "pressed enter"

另请注意:如果您使用的是ubuntu,keyboard需要root权限才能运行这样的脚本 -

sudo ./venv/bin/python 1.py 

答案 4 :(得分:0)

您需要切换到与窗口不同的警报。一旦出现警报,您切换警报句柄,然后使用(15->20)方法为其提供用户名和密码

.authenticate

您可能需要等待alert = driver.switch_to.alert alert.authenticate(username, password) 预期的情况,以确保警报存在。

答案 5 :(得分:-1)

试试这个(page_title是弹出窗口的标题,假设你在windows机器上):

from win32com.client import Dispatch
autoit = Dispatch("AutoItX3.Control")

def _window_movement_windows(page_title):
        autoit.WinSetOnTop(page_title, "", 1)
        autoit.WinActivate(page_title, "")
        autoit.WinWaitActive(page_title)

如何使用python设置AutoIt的示例可以在这里找到:Calling AutoIt Functions in Python

答案 6 :(得分:-1)

使用Firefox,可以通过在请求时自动提供凭据来避免身份验证弹出窗口。

它需要在浏览器级别注入并运行一些代码来检测身份验证尝试并设置凭据。

这是一个有效的例子:

EXPORT_LD_LIBRARY