Тестирование Electron приложений с использованим Selenium ChromeDriver + Pytest

Добрый день, коллеги!

Написал тестовый набор selenium + pytest для веб приложения. Данное приложение имеет и Electron app версию для Mac (офф сайт Electron’а). Хочу с минимальными усилиями перенести данный набор для тестирования Electron-версии данного приложения. Но при попытке запуска столкнулся с проблемой. Я запускаю тест, тот в свою очередь запускает Electron приложение и падает с ошибкой. Я пытался реализовать это двумя способами, ниже привожу их и соответствующие ошибки:


Подход 1. Стартуем локально chromedriver:

$ ./chromedriver --port=9515 > /dev/null

Фрагмент conftest.py:

from selenium import webdriver
...
APP_PATH = "/path_to_app/my_app.app/Contents/MacOS/my_app"
PORT = "http://localhost:9515"
...
@pytest.fixture(scope='function', autouse=True)
def test_setup(request):
    driver = webdriver.remote.webdriver.WebDriver(
        command_executor=PORT,
        desired_capabilities = {'chromeOptions':{ 'binary': APP_PATH}},
        browser_profile=None,
        proxy=None,
        keep_alive=False)
    driver.implicitly_wait(15)
    def fin():
        driver.quit()
    request.addfinalizer(fin)
    return driver

Тест test_electron.py:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


def test_electron(test_setup):
    # electron test
    driver = test_setup
    el = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='Your phone number']")))
    el.send_keys('1234567890')

Запуск:

$ py.test -v -s tests/test_electron.py

Ошибка:

E       selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited normally
E         (Driver info: chromedriver=2.30.477690 (c53f4ad87510ee97b5c3425a14c0e79780cdf262),platform=Mac OS X 10.12.6 x86_64)

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py:192: WebDriverException

Подход 2. Без локального старта chromedriver (использовал просто python для простоты):

import os
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


chromedriver_path = "/path_to_chromedriver/chromedriver"
electron_path = "/path_to_app/my_app.app/Contents/MacOS/my_app"

opts = Options()
opts.binary_location = electron_path
driver = webdriver.Chrome(executable_path=chromedriver_path, chrome_options=opts)
driver.implicitly_wait(15)

time.sleep(3) # отладочные слипы)
el = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='Your phone number']")))
el.send_keys('1234567890')
time.sleep(3)
driver.find_element_by_xpath("//div[.='Next']").click()
time.sleep(3)
driver.quit()

Запуск:

$ python3.6 check_form.py

Ошибка:

selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited normally
  (Driver info: chromedriver=2.30.477690 (c53f4ad87510ee97b5c3425a14c0e79780cdf262),platform=Mac OS X 10.12.6 x86_64)

Подскажите, кто сталкивался с подобным, как правильно реализовать данное взаимодействие? Ниже привожу скрин, показывающий, что элемент с приведенным XPATH находится и единственный.

1 лайк
  1. на каких строчках падает?

  2. поднимает приложение в обоих случаях и потом падает?

  3. на базе какой версии хрома запускаете? может версия драйвера не подходит…

  4. пробовали autouse убрать?

не понимаю зачем он вам… (вы его и так напрямую вызываете)

Спасибо за ответ, @ibalagurov !

  1. Падает на строчке
el = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='Your phone number']")))
  1. Все верно, тест запускает приложение, ждет элемент, не находит его и падает по таймауту
  2. Версия хромдрайвера ChromeDriver 2.30.477690, версия Chrome 56.0.2924.87
  3. autouse там не имеет никакого влияния и присутствует только потому, что использовался изначально для тестового набора под браузер

Удалось в итоге оганизовать АТ для приложения, написанного на Electron’e?