将Selenium WebDriver连接到嵌入在JPanel中的SWT浏览器

时间:2019-05-01 08:24:30

标签: selenium selenium-webdriver javafx swt

我正在建立一个自动化框架,用于自动化JavaFx应用程序中的某些流程。有一个新的用例,我们需要使用SWT浏览器API在我们的应用程序中显示外部第三方网页。

enter image description here

由于我的应用程序使用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的本机浏览器来呈现网页。它正在使用:

    Windows上的
  • IE 11
  • Ubuntu上的Safari 11

问题: 我们如何才能让Selenium连接到SWTBrowser嵌入式OS浏览器的 WebDrivers 来访问现有浏览器会话中的dom?

编辑: 进行了一些调试,并注意以下几点:

硒有两个用于自动化测试的部分。 客户端服务器。客户端将自动化操作作为HTTP POST请求发送到服务器。服务器负责产生所需的浏览器并执行实际的交互。

我正在浏览服务器的code,发现服务器使用 IELaunchURL() / CreateProcess() API启动了本机浏览器。还有一种 attachToBrowser(...) 方法。

我想通过发送嵌入在SWTBrowser中的Internet Explorer的进程信息来使用 attachToBrowser(...)方法。这种方法还有另一个困难。看起来SWTBrowser不会直接产生IE进程。它与Internet Explorer的dll进行交互。 resources used by the SWT browser application 无论如何,在这种情况下,我是否可以提取嵌入式IE进程的进程信息?还是我可以通过其他方法解决这个问题?

2 个答案:

答案 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无法做到这一点。

作为解决方案,您可以使用视觉自动化工具:

这两个工具都是跨平台的(Win,Mac,Linux)。