Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过Selenium Webdriver将焦点设置为登录,以便机器人工作_Java_Selenium - Fatal编程技术网

Java 通过Selenium Webdriver将焦点设置为登录,以便机器人工作

Java 通过Selenium Webdriver将焦点设置为登录,以便机器人工作,java,selenium,Java,Selenium,我正在测试一个只能通过internet explorer访问的内部网站,该网站使用windows身份验证来验证用户凭据,并且必须测试多个帐户,因此我需要能够以不同的身份“登录”该网站(我之前考虑过让多台机器作为相关帐户登录,但无法做到这一点) 如果我以我的webdriver帐户进入该页面,我会得到一个标准的internet explorer“Windows安全”弹出窗口,在那里我可以毫无问题地输入登录详细信息。目前唯一的问题是webdriver无法识别弹出窗口 我想我可以使用Java Robot

我正在测试一个只能通过internet explorer访问的内部网站,该网站使用windows身份验证来验证用户凭据,并且必须测试多个帐户,因此我需要能够以不同的身份“登录”该网站(我之前考虑过让多台机器作为相关帐户登录,但无法做到这一点)

如果我以我的webdriver帐户进入该页面,我会得到一个标准的internet explorer“Windows安全”弹出窗口,在那里我可以毫无问题地输入登录详细信息。目前唯一的问题是webdriver无法识别弹出窗口

我想我可以使用Java Robot类来实现这一点,并且已经删除了一些代码,我发现这些代码可以插入到我的Selenium webdriver脚本中,它几乎可以正常工作,问题是,只有手动单击显示的登录窗口,它才能复制并粘贴详细信息(请参见下面的代码).关于如何在复制和粘贴之前使用Selenium或robot设置此对象的焦点,有何建议

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);

这是因为身份验证窗口上不存在焦点。您不能尝试使用Robot的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);

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

Func_WinWaitActivate($title,$text,$timeout=100) WinWait($title,$text,$timeout) 如果不是WinActive($title,$text),则WinActivate($title,$text) WinWaitActive($title、$text、$timeout) EndFunc

然后,在导航到弹出窗口的页面后,我在代码中调用以下命令:-

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

嘿,普雷斯托!登录出现的那一刻,它就输入了登录详细信息……我想我现在必须这样做!:)

如果可能的话,我真的不想再使用另一个软件,但如果java/robot/selenium中没有替代品,我想我必须研究这个选项……:三一重工的想法如何我可以脚本一个简单的autoit exe,只是设置在安全对话框弹出焦点?这样我就可以在selenium中使用sendkey了?
try {
    Runtime.getRuntime().exec("C:\\test\\test.exe");
} catch (IOException e) {
    e.printStackTrace();
}