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