【问题标题】:Using the Java Robot class with Selenium and IE在 Selenium 和 IE 中使用 Java Robot 类
【发布时间】:2017-07-20 15:54:30
【问题描述】:

我们使用 IE 和 Java 运行 Selenium。单击网页上的链接会打开一个新的 IE 页面,该页面显然不是 IE 驱动程序的子页面,因此我无法执行 driver.switchTo();该页面是一个带有空白文件名和确定按钮的表单。以前的开发人员创建了一个机器人类并发送了 9 个 TAB keyPress 事件以到达 OK 按钮,然后是一个

  robot.keyPress(KeyEvent.VK_ENTER);
  robot.keyRelease(KeyEvent.VK_ENTER);

现在我需要更改文件名中的值,所以我计算了 TABS 的数量,直到找到文件,然后执行退格键并像这样键入文件名:

                    for (int ic = 0; ic < filePrefix.length(); ic++) {
                            char ch = filePrefix.charAt(ic);
                            int kc = KeyEvent.getExtendedKeyCodeForChar(ch);
                            System.out.println("Sending " + ch + "[" + kc + "]");
                            if (ch >= 'A' && ch <= 'Z') {
                                robot.keyPress(KeyEvent.VK_SHIFT);
                            }
                            robot.keyPress(kc);
                            robot.keyRelease(kc);
                            if (ch >= 'A' && ch <= 'Z') {
                                robot.keyRelease(KeyEvent.VK_SHIFT);
                            }
                            Thread.sleep(500);
                        }

这可以在我的机器上运行,但我相信我们第一次运行它时它只是暂停了,当我点击网页时,它询问我是否要允许机器人更改文本。

问题是,这将在 Jenkins 中运行,没有人会回答关于允许机器人访问文本的问题。此外,我知道在 Selenium 网格上运行时,Robot 不是很可靠。

所以我想知道,首先有没有办法启动 IE 并允许机器人读取和更改文本>

其次,这甚至可以在 Selenium Grid(远程)上工作吗?

更好的是,我们如何让 IE 驱动程序能够访问此页面,这样我就可以首先使用非常简单的 xpaths 而不是 Robot(我认为这是不可能的)?

哦,不幸的是,对于这个网站,我们需要 IE,不能使用 Chrome 或 Firefox。

【问题讨论】:

  • 我不认为我相信由 Selenium 控制的另一个实例启动的浏览器实例是不可访问的。你确定你完全测试过吗?我以前从未见过。您可能需要短暂等待以确保新浏览器实例已完全加载,然后才能访问它。你能分享一下这个网站,以便我们测试一些东西吗?
  • 不幸的是它在我们公司的防火墙内,否则我会。从外面无法进入。至于访问窗口,一位知识渊博的人告诉我同样的事情,你不能这样做。我们有一个功能,您可以拍摄窗口快照,单击链接,然后等待新窗口并切换到它,因此它应该等到出现新窗口并且窗口完成。但是我什至在睡觉后做了一种(对于String id:driver.getWindowHandles()),并切换到每个窗口,试图找到元素,甚至切换到任何帧。没什么好担心的
  • ked(对不起,我上面的字符用完了)

标签: selenium internet-explorer


【解决方案1】:

这是一个真正简单的测试,可确保您所说的内容属实。此代码使用测试站点等待新窗口加载。您可以使用此代码,为启动新窗口的链接/按钮/事物添加您自己的 URL 和定位器,然后查看 Selenium 是否检测到新窗口启动。

String url = "http://the-internet.herokuapp.com/windows";
driver.navigate().to(url);
int currentWindows = driver.getWindowHandles().size();
driver.findElement(By.linkText("Click Here")).click();
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.numberOfWindowsToBe(currentWindows + 1));
System.out.println("Found a 2nd window");

如果有效,您应该会在控制台中看到Found a 2nd window。如果没有,您应该看到TimeoutException

【讨论】:

  • 我会试试的。我一直想知道。窗口句柄在不一定有序的集合中返回。如果有很多窗把手,你怎么知道哪个是最后一个打开的?我认为它不一定是迭代集合时返回的最后一个?
  • 正确。 Set 不保证在 Java 中订购。在打开新窗口之前抓住Set,然后在打开窗口后找到之前Set 中没有的句柄,这就是新窗口。
  • 引起:org.openqa.selenium.TimeoutException: 等待打开窗口数为3 30秒后超时
  • 是的。每次单击链接都会打开一个新窗口。他们等待窗口并切换到它。他们试图等待这个但从未得到它,所以不得不使用 Robot()。我必须修改它以在字段中输入文本(必须与 ctrl-v 相关),但默认情况下,我相信 IE 不允许这样做。
  • 他们决定跳过这个测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多