是否可以使用 Selenium WebDriver 来自动化桌面应用程序?

Posted

技术标签:

【中文标题】是否可以使用 Selenium WebDriver 来自动化桌面应用程序?【英文标题】:Is it possible to use Selenium WebDriver for automating desktop applications? 【发布时间】:2017-05-30 03:00:57 【问题描述】:

我正准备为目前处于开发初期的 Web/桌面应用程序编写自动化测试。将使用的技术是 Laravel、VueJS 和最重要的 Electron 框架。 Electron 是一个使用 javascripthtml 和 CSS 等 Web 技术创建原生应用程序的框架。

所以我很好奇是否可以使用 Selenium WebDriver 来自动化使用 Web 技术(例如 Electron)创建的桌面应用程序?

我已经成功地为“Slack Web 应用程序”编写了一些 Selenium/Java 测试(Slack 是使用 Electron framefork 开发的)

现在我想尝试使用相同的测试来测试“Slack 桌面应用程序”。如果可能的话,也许我可以更改“SetupSelenium”@Before 方法?

这是基于 Web 的应用程序的初始“SetupSelenium”方法: @BeforeMethod

public void setupSelenium() 
    baseUrl = "https://slack.com/";

    System.setProperty("webdriver.chrome.driver", "C:\\UOOP\\WorkspaceJava\\chromedriver.exe");

    driver = new ChromeDriver();
    driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
    driver.manage().window().maximize();
    driver.navigate().to(baseUrl);

    homePage = new HomePage(driver);
    signInPage = new SignInPage(driver);
    signInToYourTeamPage = new SignInToYourTeamPage(driver);

如果有人有任何想法,我很感激帮助...也许可以将二进制路径设置为 slack.exe ?? 收件人:C:\Users\Danant\AppData\Local\slack\slack.exe

【问题讨论】:

【参考方案1】:

创建ChromeDriver时需要设置一些ChromeOptions,比如:

ChromeOptions options = new ChromeOptions();
options.setBinary(new File("C:\\path\\to\\slack.exe"));

ChromeDriver driver = new ChromeDriver(options);

Electron 文档中也有关于此主题的教程:https://xwartz.gitbooks.io/electron-gitbook/content/en//tutorial/using-selenium-and-webdriver.html

【讨论】:

谢谢。我在上面尝试了您的代码,但收到以下错误: [2996:0115/154221:INFO:CONSOLE(24)] "(node:7180) DeprecationWarning: 'root' is deprecated, use 'global'", source: internal/process/warning. js (24) 即将针对 C:\Users\Danant\AppData\Local\slack\app-2.4.1\slack.exe 修复 Slack Tray Icons 未能提升 Tray 图标:System.Runtime.InteropServices.InvalidComObjectException: COM 对象已经与其底层分离的RCW不能使用。在 SlackNotifier.TrayStateChanger.d__1.MoveNext() 在 SlackNotifier.TrayStateChanger.d__1.MoveNext() 即将针对 C:\Users\Danant\AppData\Local\slack\app-2.4.1\slack.exe 修复 Slack 托盘图标无法提升托盘图标:System.Runtime.InteropServices.InvalidComObjectException:无法使用已与其基础 RCW 分离的 COM 对象。在 SlackNotifier.TrayStateChanger.d__1.MoveNext()【参考方案2】:

如果您只是测试电子应用程序,请查看专为此目的设计的 spectron。

当我测试我的应用程序的开发版本时,我会运行以下测试:

const Application = require('spectron').Application

...

beforeEach(function () 
  this.app = new Application(
    path: './node_modules/electron/dist/electron.exe',
    args: ['./www/']
  );

  return this.app.start()
)

afterEach(function () 
  if (this.app && this.app.isRunning()) 
    return this.app.stop()
  
)

it('shows an initial single window', function () 
  return this.app.client
    .getWindowCount()
    .should.eventually.equal(1)
)

要测试生产应用,只需修改传递给Application 选项的path

【讨论】:

谢谢。如果您使用 Java Script 编写代码,此解决方案可能会起作用。我更喜欢用 Java 编写代码。我的朋友在 Java Script 方面比我更有经验,他们告诉我他们在使用 Spectron 和 Webriver IO 时遇到了问题。所以我决定尝试使用 Selenium。 非常正确。仅限 JavaScript/TypeScript。虽然您无法通过 Selenuim 访问电子 API。

以上是关于是否可以使用 Selenium WebDriver 来自动化桌面应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用selenium Webdriver验证页面中是否存在重复文本

是否不赞成使用Selenium中的WebDriverWait(WebDriver驱动程序,long timeoutInSeconds)?

是否可以通过 selenium webdriver 执行 OnClick javascript 函数而无需单击

我们是否需要同时拥有Selenium服务器和Selenium WebDriver?

使用 Selenium webdriver 运行时是不是可以使用 Chrome 的 devtools?

python selenium webdriver 怎么 获得 ajax 返回 内容