通过Selenium Webdriver让Robot重点登录工作

时间:2013-09-20 09:02:58

标签: java selenium

我正在测试一个只能通过Internet Explorer访问的内部网站,该网站使用Windows身份验证来验证用户凭据并且必须测试多个帐户,因此我需要能够"登录&#34 34;以不同的人的身份访问网站(我以前曾考虑过将几台机器作为相关帐户登录但不能这样做)。

如果我作为我的webdriver帐户访问该页面,我会得到一个标准的Internet Explorer" Windows Security"弹出窗口,我可以毫无问题地输入我的登录详细信息。到目前为止,只有问题是webdriver无法识别弹出窗口。

我以为我可以使用Java Robot类来执行此操作并删除了我发现插入我的Selenium webdriver脚本的一些代码并且几乎可以工作,麻烦只有在我手动操作时才有效单击提供的登录窗口以复制和粘贴详细信息(请参阅下面的代码)。有关如何在复制和粘贴之前使用Selenium或机器人将焦点设置在此对象上的任何建议吗?

public Boolean loginDetails(individualThreadSession threadSesh){
        Action myAction = new Action();
        final String USERNAME= "loginID";
        final String PASSWORD= "myPassword";
        myAction.simpleWait(1);

        Robot robot = null;
        try {
            robot = new Robot();
        } catch (AWTException e) {e.printStackTrace();}

        type(robot, USERNAME);
        myAction.simpleWait(1);
        robot.keyPress(KeyEvent.VK_TAB);
        myAction.simpleWait(1);
        robot.keyRelease(KeyEvent.VK_TAB);

        myAction.simpleWait(1);

        type(robot, PASSWORD);
        myAction.simpleWait(1);
        robot.keyPress(KeyEvent.VK_ENTER);
        myAction.simpleWait(1);
        robot.keyRelease(KeyEvent.VK_ENTER);
        myAction.simpleWait(1);

        return(true);
    }

    public static void type(Robot robot, String characters) {
        Action myAction = new Action(); 
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        StringSelection stringSelection = new StringSelection( characters );
        clipboard.setContents(stringSelection, null);

        robot.keyPress(KeyEvent.VK_CONTROL);
        myAction.simpleWait(1);
        robot.keyPress(KeyEvent.VK_V);
        myAction.simpleWait(1);
        robot.keyRelease(KeyEvent.VK_V);
        myAction.simpleWait(1);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        myAction.simpleWait(1);
    }

我也尝试过输入单独的击键而不是复制和粘贴信息,但这确实有用,我需要在屏幕前关注它才能工作......:S

还试过这个但仍然没有把注意力集中在Windows安全对话框上......

Alert aa = threadSesh.driver.switchTo().alert();
aa.sendKeys(USERNAME);

2 个答案:

答案 0 :(得分:1)

这是因为认证窗口中不存在焦点。您不能尝试使用机器人ALT + TAB,因为它不是一个单独的窗口。对于您的场景,我认为“AutoIT”可以是合适的解决方案。如果您想继续使用AutoIT,请告诉我我可以发送一些示例代码。

import java.io.Serializable;
import com.sun.jna.WString;

public interface AutoITX extends com.sun.jna.Library, Serializable {

public static int AU3_INTDEFAULT = -2147483647;

public int AU3_WinWaitActive(WString szTitle, WString szText, int nTimeout);

    }

为AutoITX创建一个对象,说objAutoIT。使用以下参数调用WinWaitActivate()。 根据您的要求替换windowTitle,windowText(可以为空),waitTime。

    objAutoIT.AU3_WinWaitActive(WString(windowTitle), WString(windowText), waitTimeInSecs);

答案 1 :(得分:1)

我已经设法使用autoit创建一个独立的exe(用于编写和编译的软件可能更好,我必须说,但它是免费的,所以我不能抱怨)使用以下代码: -

Func _WinWaitActivate($ title,$ text,$ timeout = 100)     WinWait($标题,$文本,$超时)     如果不是WinActive($ title,$ text)那么WinActivate($ title,$ text)     WinWaitActive($标题,$文本,$超时) ENDFUNC

_WinWaitActivate("Windows Security","")
Send("myloginID{TAB}mypassword{ENTER}")

然后,当我导航到弹出弹出窗口的页面时,我会在我的代码中使用以下代码调用它: -

try {
    Runtime.getRuntime().exec("C:\\test\\test.exe");
} catch (IOException e) {
    e.printStackTrace();
}

嘿嘿!登录出现的那一刻它输入登录详细信息......我想现在必须要做! :)