我正在建立一个自动化框架,用于自动化JavaFx应用程序中的某些流程。有一个新的用例,我们需要使用SWT浏览器API在我们的应用程序中显示外部第三方网页。
由于我的应用程序使用JavaFX而不是SWT,因此我不得不使用提到的here方法来嵌入swt浏览器。我们必须使用swt浏览器,因为第三方应用程序提供的API使用swt事件侦听器与我的应用程序进行通信。
现在,浏览器已嵌入,我们需要使用自动化测试来测试某些数据交换方案。我试图通过编写一些包装方法来使用SWTBrowser.execute(String script)方法来使流程自动化。示例代码:
public void setTextById(String id, String text) throws InterruptedException
{
Browser browser = getSwtBrowser();
CountDownLatch latch = new CountDownLatch(1);
browser.getDisplay().syncExec(new Runnable()
{
@Override public void run()
{
boolean result = browser
.execute("document.getElementById('" + id + "').setAttribute('value', '" + text + "');");
latch.countDown();
}
});
latch.await();
}
但是这种方法似乎正在重新发明轮子,并且容易出现很多错误。我计划使用 Selenium 在网页中进行一些内容访问/操作,因为我们已经在应用程序中的其他用例中使用了Selenium。
SWT浏览器使用建议的here来部署Web的本机浏览器来呈现网页。它正在使用:
问题: 我们如何才能让Selenium连接到SWTBrowser嵌入式OS浏览器的 WebDrivers 来访问现有浏览器会话中的dom?
编辑: 进行了一些调试,并注意以下几点:
硒有两个用于自动化测试的部分。 客户端和服务器。客户端将自动化操作作为HTTP POST请求发送到服务器。服务器负责产生所需的浏览器并执行实际的交互。
我正在浏览服务器的code,发现服务器使用 IELaunchURL() / CreateProcess() API启动了本机浏览器。还有一种 attachToBrowser(...) 方法。
我想通过发送嵌入在SWTBrowser中的Internet Explorer的进程信息来使用 attachToBrowser(...)方法。这种方法还有另一个困难。看起来SWTBrowser不会直接产生IE进程。它与Internet Explorer的dll进行交互。 无论如何,在这种情况下,我是否可以提取嵌入式IE进程的进程信息?还是我可以通过其他方法解决这个问题?
答案 0 :(得分:1)
您将必须启动新的IE WebDriver
,然后将其附加到现有的浏览器。我进行了一些研究,我想出的只是这个旧线程:Can Selenium interact with an existing browser session?
此方法使用的是RemoteWebDriver
,因此您将需要独立版本的Selenium。对我来说-似乎是一种矫kill过正,可能容易出错。我的建议是集成某种与嵌入式浏览器交互的图像识别软件。我知道 Sikuli 会做类似的事情,并且它具有Java API。您可以在这里获得它:Sikuli
答案 1 :(得分:1)
希望有一种方法可以使用Selenium来控制嵌入式浏览器。
使用硒see here for a similar issue无法做到这一点。
作为解决方案,您可以使用视觉自动化工具:
Sikuli-可以通过Python集成到您的设置中
这两个工具都是跨平台的(Win,Mac,Linux)。