1

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

如果我以我的 webdriver 帐户访问该页面,我会得到一个标准的 Internet Explorer“Windows 安全”弹出窗口,我可以在其中毫无问题地输入我的登录详细信息。到目前为止唯一的问题是 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);
4

2 回答 2

1

这是因为焦点不在身份验证窗口上。您不能尝试 ALT+TAB 与 Robot,因为它不是一个单独的窗口。对于您的情况,我认为“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);
于 2013-09-20T09:27:50.060 回答
1

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

Func _WinWaitActivate($title,$text,$timeout=100) WinWait($title,$text,$timeout) If Not WinActive($title,$text) Then WinActivate($title,$text) WinWaitActive($title,$ text,$timeout) EndFunc

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

然后,一旦我导航到弹出弹出窗口的页面,我就会在我的代码中调用它: -

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

嘿,快!登录出现的那一刻,它会输入登录详细信息……我想现在必须这样做!:)

于 2013-09-20T11:36:28.600 回答