如何使用selenium webdriver处理ModalDialog?

zzzyeukh  于 2023-02-12  发布在  其他
关注(0)|答案(9)|浏览(392)

我无法切换到给定示例的模态对话框
http://samples.msdn.microsoft.com/workshop/samples/author/dhtml/refs/showModalDialog2.htm
我不知道如何在模态对话框上获取元素

uajslkp6

uajslkp61#

用途
以下方法切换到modelframe

  1. driver.switchTo().frame("ModelFrameTitle");

  1. driver.switchTo().activeElement()

希望这个能管用

2ledvvac

2ledvvac2#

您使用的不是模型对话框,而是一个单独的窗口。
使用此代码:

  1. private static Object firstHandle;
  2. private static Object lastHandle;
  3. public static void switchToWindowsPopup() {
  4. Set<String> handles = DriverManager.getCurrent().getWindowHandles();
  5. Iterator<String> itr = handles.iterator();
  6. firstHandle = itr.next();
  7. lastHandle = firstHandle;
  8. while (itr.hasNext()) {
  9. lastHandle = itr.next();
  10. }
  11. DriverManager.getCurrent().switchTo().window(lastHandle.toString());
  12. }
  13. public static void switchToMainWindow() {
  14. DriverManager.getCurrent().switchTo().window(firstHandle.toString());
展开查看全部
sirbozc5

sirbozc53#

Try the below code. It is working in IE but not in FF22. If找到模态对话框is printed in Console, then Modal dialog is identified and switched.

  1. public class ModalDialog {
  2. public static void main(String[] args) throws InterruptedException {
  3. // TODO Auto-generated method stub
  4. WebDriver driver = new InternetExplorerDriver();
  5. //WebDriver driver = new FirefoxDriver();
  6. driver.get("http://samples.msdn.microsoft.com/workshop/samples/author/dhtml/refs/showModalDialog2.htm");
  7. String parent = driver.getWindowHandle();
  8. WebDriverWait wait = new WebDriverWait(driver, 10);
  9. WebElement push_to_create = wait.until(ExpectedConditions
  10. .elementToBeClickable(By
  11. .cssSelector("input[value='Push To Create']")));
  12. push_to_create.click();
  13. waitForWindow(driver);
  14. switchToModalDialog(driver, parent);
  15. }
  16. public static void waitForWindow(WebDriver driver)
  17. throws InterruptedException {
  18. //wait until number of window handles become 2 or until 6 seconds are completed.
  19. int timecount = 1;
  20. do {
  21. driver.getWindowHandles();
  22. Thread.sleep(200);
  23. timecount++;
  24. if (timecount > 30) {
  25. break;
  26. }
  27. } while (driver.getWindowHandles().size() != 2);
  28. }
  29. public static void switchToModalDialog(WebDriver driver, String parent) {
  30. //Switch to Modal dialog
  31. if (driver.getWindowHandles().size() == 2) {
  32. for (String window : driver.getWindowHandles()) {
  33. if (!window.equals(parent)) {
  34. driver.switchTo().window(window);
  35. System.out.println("Modal dialog found");
  36. break;
  37. }
  38. }
  39. }
  40. }
  41. }
展开查看全部
euoag5mw

euoag5mw4#

R(R selenium )溶液:我有一个弹出对话框(这是动态生成的),因此在原始页面源代码中无法检测这里是为我工作的方法:
方法1:模拟按Tab键并切换到该模态对话框我的当前键集中在模态对话框

  1. remDr$sendKeysToActiveElement(list(key = "tab"))
  2. Sys.sleep(5)
  3. remDr$sendKeysToActiveElement(list(key = "enter"))
  4. Sys.sleep(15)

后面的下拉按钮方法2:如果你能找到框架(或iframe),将焦点移到它

  1. date_filter_frame <- remDr$findElement(using = "tag name", 'iframe')
  2. date_filter_frame$highlightElement()
  3. Sys.sleep(5)
  4. remDr$switchToFrame(date_filter_frame)
  5. Sys.sleep(2)

现在你可以在框架中搜索元素了。记住在命令之间放置足够的Sys.sleep,以便正确加载元素(以防万一)

  1. date_filter_element <- remDr$findElement(using = "xpath", paste0("//*[contains(text(), 'Week to Date')]"))
  2. date_filter_element$highlightElement()
展开查看全部
mrwjdhj3

mrwjdhj35#

试试这个代码,包括你的对象名和变量工作.

  1. Set<String> windowids = driver.getWindowHandles();
  2. Iterator<String> iter= windowids.iterator();
  3. for (int i = 1; i < sh.getRows(); i++)
  4. {
  5. while(iter.hasNext())
  6. {
  7. System.out.println("Main Window ID :"+iter.next());
  8. }
  9. driver.findElement(By.id("lgnLogin_UserName")).clear();
  10. driver.findElement(By.id("lgnLogin_UserName")).sendKeys(sh.getCell(0,
  11. i).getContents());
  12. driver.findElement(By.id("lgnLogin_Password")).clear();
  13. driver.findElement(By.id("lgnLogin_Password")).sendKeys(sh.getCell(1,
  14. i).getContents());
  15. driver.findElement(By.id("lgnLogin_LoginButton")).click();
  16. Thread.sleep(5000L);
  17. windowids = driver.getWindowHandles();
  18. iter= windowids.iterator();
  19. String main_windowID=iter.next();
  20. String tabbed_windowID=iter.next();
  21. System.out.println("Main Window ID :"+main_windowID);
  22. //switch over to pop-up window
  23. Thread.sleep(1000);
  24. driver.switchTo().window(tabbed_windowID);
  25. System.out.println("Pop-up window Title : "+driver.getTitle());
展开查看全部
8ehkhllq

8ehkhllq6#

我试过了,对你很有效。

  1. String mainWinHander = webDriver.getWindowHandle();
  2. // code for clicking button to open new window is ommited
  3. //Now the window opened. So here reture the handle with size = 2
  4. Set<String> handles = webDriver.getWindowHandles();
  5. for(String handle : handles)
  6. {
  7. if(!mainWinHander.equals(handle))
  8. {
  9. // Here will block for ever. No exception and timeout!
  10. WebDriver popup = webDriver.switchTo().window(handle);
  11. // do something with popup
  12. popup.close();
  13. }
  14. }
展开查看全部
holgip5t

holgip5t7#

假设预期只是弹出两个窗口(一个父窗口,一个弹出窗口),那么只需等待两个窗口出现,找到另一个窗口句柄并切换到它。

  1. WebElement link = // element that will showModalDialog()
  2. // Click on the link, but don't wait for the document to finish
  3. final JavascriptExecutor executor = (JavascriptExecutor) driver;
  4. executor.executeScript(
  5. "var el=arguments[0]; setTimeout(function() { el.click(); }, 100);",
  6. link);
  7. // wait for there to be two windows and choose the one that is
  8. // not the original window
  9. final String parentWindowHandle = driver.getWindowHandle();
  10. new WebDriverWait(driver, 60, 1000)
  11. .until(new Function<WebDriver, Boolean>() {
  12. @Override
  13. public Boolean apply(final WebDriver driver) {
  14. final String[] windowHandles =
  15. driver.getWindowHandles().toArray(new String[0]);
  16. if (windowHandles.length != 2) {
  17. return false;
  18. }
  19. if (windowHandles[0].equals(parentWindowHandle)) {
  20. driver.switchTo().window(windowHandles[1]);
  21. } else {
  22. driver.switchTo().window(windowHandles[0]);
  23. }
  24. return true;
  25. }
  26. });
展开查看全部
ibrsph3r

ibrsph3r8#

不,模型窗口需要由javaScriptExecutor处理,因为主要模型窗口由窗口模型组成,这将在模型出现后工作,然后控制进入模型并单击预期元素。
必须导入javascriptexector
如下所述,

  1. Javascriptexecutor js =(Javascriptexecutor).driver;
  2. js.executescript(**<element to be clicked>**);
pes8fvy9

pes8fvy99#

pidoss. 1加上我的2美分,即使问题太老了

  1. public void PressEnterKey()
  2. {
  3. var simulator = new InputSimulator();
  4. simulator.Keyboard.KeyPress(VirtualKeyCode.RETURN);
  5. }

你可以创建一个类似上面的方法,并在需要的地方调用它。
pidoss. 2 -你也可以改变键盘输入(如向上箭头,向下箭头,向下翻页等)

相关问题