3

我用 java testng 编写了一个 selenium 代码来提交表单。单击提交按钮后,页面导航到感谢页面。但在加载之前,thankyou 会收到一个安全警告对话框,其中包含名为“继续”和“取消”的选项。如何通过 selenium 控件单击继续。无法获取继续按钮的 xpath 或 id。

4

4 回答 4

1

有同样的问题,这适用于 firefox 13 和 selenium 2.0

使用 spy 获取窗口信息。对于 firefox 13 windows 类是 MozillaDialogClass WindowName 是安全警告。

申报进口

[DllImport("user32.dll")]
public static extern int FindWindow(string className, string windowName);

制作方法

public static void SetOkButton(string className, string windowName)
    {            
        int handle = FindWindow(className, windowName);

        if (handle > 0)
        {

            if (SetForegroundWindow(handle))
            {
                SendKeys.SendWait("{ENTER}");
            }
        }
    }

调用方法

SetOkButton("MozillaDialogClass", "Security Warning");
于 2012-09-18T12:45:02.777 回答
1

请记住在它出现之前添加一个等待,否则您的代码可能会在警报实际出现之前执行。以下代码对我有用

    private void acceptSecurityAlert() {

    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver).withTimeout(10, TimeUnit.SECONDS)          
                                                            .pollingEvery(3, TimeUnit.SECONDS)          
                                                            .ignoring(NoSuchElementException.class);    
    Alert alert = wait.until(new Function<WebDriver, Alert>() {       

        public Alert apply(WebDriver driver) {

            try {

                return driver.switchTo().alert();

            } catch(NoAlertPresentException e) {

                return null;
            }
        }  
    });

    alert.accept();
}
于 2017-04-07T05:43:01.123 回答
0

如果那是页面加载时的 JS 确认框,那么(正如文档所说),您无能为力。Selenium 2 ( WebDriver ) 可以更好地处理这些对话框:

driver.switchTo().alert().accept();

如果那是 Firefox 的确认,你就不能用 Selenium 做任何事情。

我会给 java.awt。机器人一试。

于 2012-04-28T12:18:54.783 回答
0

“安全警告”对话框上没有“继续”按钮的 xpath 或 ID,因为此对话框不是浏览器对话框。此对话框由 Java 生成。

Selenium 仅自动化浏览器。因此,单击“继续”按钮超出了 Selenium 的范围。

幸运的是,有一种方法可以通过以下 jar 包的帮助单击“继续”按钮:jna.jar 和 jna-platform.jar 以及 java.awt.Robot 类。

如果您不知道“安全警告”何时出现,您可以编写代码等待“安全警告”出现。此代码不断检查当前活动窗口标题。一旦出现“安全警告”对话框,当前活动窗口将变为“安全警告”对话框。然后代码使用 TAB 键导航到“继续”按钮并按 ENTER 键。

进行必要的导入后,您可以使用以下方法:

public void acceptSecurityAlert() {
    //Keep checking every 7 seconds for the 'Security Warning'
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver).withTimeout(1000, TimeUnit.SECONDS).pollingEvery(7, TimeUnit.SECONDS).ignoring(NoSuchElementException.class);

    //Wait until the 'Security Warning' appears
    boolean isTrue = wait.until(new Function<WebDriver, Boolean>(){
        //implement interface method
        public Boolean apply(WebDriver driver) {
            try {                                       
                char[] buffer = new char[1024 * 2];
                HWND hwnd = User32.INSTANCE.GetForegroundWindow();
                User32.INSTANCE.GetWindowText(hwnd, buffer, 1024);
                //System.out.println("Active window title: " + Native.toString(buffer));                    

                //Check for 'Security Warning' window
                if(Native.toString(buffer).equalsIgnoreCase("Security Warning")){

                    //After 'Security Warning' window appears, use TAB key to go to 'Continue' button and press ENTER key.
                    //System.out.println("Pressing keys...");                       
                    Robot robot = new Robot();
                    robot.keyPress(KeyEvent.VK_TAB); robot.delay(200);
                    robot.keyRelease(KeyEvent.VK_TAB); robot.delay(200);

                    robot.keyPress(KeyEvent.VK_TAB); robot.delay(200);
                    robot.keyRelease(KeyEvent.VK_TAB); robot.delay(200);

                    robot.keyPress(KeyEvent.VK_ENTER); robot.delay(200);
                    robot.keyRelease(KeyEvent.VK_ENTER); robot.delay(200);
                    return true;
                }
                return null;
            }catch(Exception e) {
                System.out.println("Exception!");
                e.printStackTrace();
            } 
            return null;
        }
    });
}
于 2018-10-22T01:28:13.553 回答