uiautomation - Selenium+Codeception: добавление браузера Спутник (или любого иного на движке Chromium) в список поддерживаемых


1

Что требуется для добавления браузера в список доступных браузеров для ui-test-фреймворков (например, Codeception, Cypress или же на примере прочих фреймворков UI-автотестов) при возможности успешного запуска автотестов через соответствующий браузер? Например, интересует браузер Спутник, использующий ядро Chromium, соответственно предполагаю, что можно как-либо плясать от конфигурации и драйверов, допустимых для браузеров на движке Chromium.

Источник
  •  99
  •  1
  • 24 янв 2018 2018-01-24 11:42:07

1 ответ

0

Вкратце: используем selenium+codeception (или любой иной фреймворк, который поддерживает запуск автотестов в chrome), в yml-конфиге прописываем env для спутника, представляющее собой кастомный путь для сhrome, который по факту ведёт к экзешнику cпутника; перекомпилируем chromedriver из родительского проекта chromium (убирая проверку на версию браузера), предварительно потребуется корректно установить visual studio (С++, wdk+sdk+mfc+atl), depot_tools, perl, python2+pywin32, а также в исходниках Windows Kits поправить ошибку, из-за которой падает компилирование проекта чрез ninja.

Полезные инструкции:

на английском: http://www.chromium.org/developers/how-tos/get-the-code http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up

на русском: https://gist.github.com/oshatrk/0d454018e720b44b45d3e9679da6a98a https://habr.com/company/jugru/blog/347024/

Инструкция представлена для Windows 10.

оригинал chromedriver (скачать свежую версию и поместить в C:/Windows): https://chromedriver.storage.googleapis.com/index.html

chromium: https://github.com/chromium/chromium

Обязательно использовать только стандартную командную строку CMD, иначе столкнётесь с рядом неочевидных ошибок: например, %filename%: no such file or directory.

В Git прописываем:

$ git config --global user.name "%USERNAME%"
$ git config --global user.email "%EMAIL%"
$ git config --global core.autocrlf false
$ git config --global core.filemode false
$ git config --global branch.autosetuprebase always 

Устанавливаем Visual Studio (для C++), выбираем пакеты самого свежего SDK, пакеты MFC- и ATL-поддержки, "Debugging Tools For Windows", Windows Driver Kit (WDK) и depot tools.

Выкачиваем репозиторий chromium и подготавливаем проект для компиляции:

Для экономии места (~10Гб), лучше первую строку выполнить с флажком fetch --no-history chromium.

d:chromium> fetch chromium
d:chromium> mkdir src
d:chromium> cd src
d:chromiumsrc> gclient sync
d:chromiumsrc> gn gen out/Default

Если встретите странные ошибки в процессе выполнения gn-команд:

ninja: error: loading build.ninja: no such file or directory
ninja: error: loading build.ninja: ═х єфрхЄё эрщЄш єърчрээ√щ Їрщы.

— скорее всего, проблема или в конфликтующих установленных версиях Win10 SDK, или из-за отсутствия WDK / Debugging Tools For Windows. Переходим к автотестам. В начале проверьте на связке selenium+codeception, что автотесты действительно успешно исполняются в браузере chrome при отсутствии конфликтов с chromedriver. Например, chromedriver 2.41 поддерживает Chrome v67-69, и в итоге сможет поддерживать Sputnik v3.5.2152.0 gostssl

После того, как убедились в изначальной работоспособности, настраиваем вызов браузера Спутник (пока что без функционирования исполнения кода автотеста): в yml-конфиге создаём отдельную env-секцию, или же прописываем в стандартную секцию конфига обращение к браузеру Chrome, к которому прописываем путь к Спутнику:

modules:
  enabled: [WebDriver, WebHelper, Asserts]
  config:
    WebDriver:
      browser: chrome
      capabilities:
      chromeOptions:
        args: [--remote-debugging-port=9222]
        binary: C:/Program Files (x86)/Sputnik/Sputnik/Application/browser.exe
    #window_size: 1200x768 is not supported for Sputnik
    restart: true

Объявленный флажок --remote-debugging-port=9222 нужен во избежание ошибки [FacebookWebDriverExceptionUnknownServerException] unknown error: Devtools port number file contents <50250> were in an unexpected format. Заранее предупрежу, что не надо использовать параметр window_size, т.к. Chromium не поддерживает его, иначе встретим ошибку: [FacebookWebDriverExceptionUnknownServerException] unknown error: unhandled inspector error: {"code":-32601,"message":"Browser.getWindowForTarget wasnt found"} — бесполезно в экзешнике спутника перезаписывать информацию о продукте в соответствии с Chrome, т.к. в этом случае экзешник станет невалидным, при попытке запуска увидим ошибку "Не удалось запустить приложение, поскольку его параллельная конфигурация неправильна", а при запуске автотестов встретим ошибку: [FacebookWebDriverExceptionUnknownServerException] unknown error: Failed to create a Chrome process. При запуске автотестов на Спутнике, мы должны увидеть ошибку: [FacebookWebDriverExceptionUnknownServerException] unknown error: unrecognized Chrome version: SputnikBrowser/3.5.2152.0 (GOST)

— решается перекомпиляцией chromedriver, предварительно удалив в нём проверку на версию браузера.

Проверьте, что действительно можете скопилировать chromedriver из исходников:

d:chromiumsrc> ninja -C out/Default chromedriver

если всё ок, то файл будет располагаться здесь:

d:chromiumsrcoutDefaultchromedriver.exe

Проверьте, что с данной скомпилированной версией chromedriver действительно успешно-корректно исполняются автотесты в браузере Chrome, предварительно положив обновлённый chromedriver.exe в C:/Windows.

Редактируем chromedriverchromebrowser_info.cc:128, игнорируя несоответствие версии браузера:

return error;

— статус ошибки заменяем на успешный статус:

return Status(kOk);

Скомпилируйте chromedriver снова, предварительно удалив содержимое папки Default. А также в случае ошибок при компиляции, следует очищать папку перед следующей компиляцией, иначе скомпилированный экзешник скорее всего окажется битым.

Если компиляция прошла успешно, то положите обновлённый chromedriver.exe в C:/Windows и сначала проверьте, что в браузере Chrome по-прежнему успешно исполняются автотесты, при успехе проверьте работоспособность в браузере Спутник.

Если в процессе компиляции встретитесь со следующим логом ошибки

[3281/4416] CXX obj/ui/gfx/gfx/font_fallback_win.obj
FAILED: obj/ui/gfx/gfx/font_fallback_win.obj
../../third_party/llvm-build/Release+Asserts/bin/clang-cl.exe /nologo /showIncludes "-imsvc..............Program Files (x86)Microsoft Visual Studio2017EnterpriseVCToolsMSVC14.15.26726ATLMFCinclude" "-imsvc..............Program Files (x86)Microsoft Visual Studio2017EnterpriseVCToolsMSVC14.15.26726include" "-imsvc..............Program Files (x86)Windows Kits10include10.0.17134.0ucrt" "-imsvc..............Program Files (x86)Windows Kits10include10.0.17134.0shared" "-imsvc..............Program Files (x86)Windows Kits10include10.0.17134.0um" "-imsvc..............Program Files (x86)Windows Kits10include10.0.17134.0winrt" "-imsvc..............Program Files (x86)Windows Kits10include10.0.17134.0cppwinrt" -DGFX_IMPLEMENTATION -DV8_DEPRECATION_WARNINGS -DUSE_AURA=1 -DNO_TCMALLOC -DFULL_SAFE_BROWSING -DSAFE_BROWSING_CSD -DSAFE_BROWSING_DB_LOCAL -DOFFICIAL_BUILD -DCHROMIUM_BUILD -DFIELDTRIAL_TESTING_ENABLED "-DCR_CLANG_REVISION="338452-2"" -D_HAS_NODISCARD -D_HAS_EXCEPTIONS=0 -D__STD_C -D_CRT_RAND_S -D_CRT_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_DEPRECATE -D_ATL_NO_OPENGL -D_WINDOWS -DCERT_CHAIN_PARA_HAS_EXTRA_FIELDS -DPSAPI_VERSION=1 -DWIN32 -D_SECURE_ATL -D_USING_V110_SDK71_ -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -DWIN32_LEAN_AND_MEAN -DNOMINMAX -D_UNICODE -DUNICODE -DNTDDI_VERSION=0x0A000002 -D_WIN32_WINNT=0x0A00 -DWINVER=0x0A00 -DNDEBUG -DNVALGRIND -DDYNAMIC_ANNOTATIONS_ENABLED=0 -DWEBP_EXTERN=extern -DSK_IGNORE_LINEONLY_AA_CONVEX_PATH_OPTS -DSK_HAS_PNG_LIBRARY -DSK_HAS_WEBP_LIBRARY -DSK_HAS_JPEG_LIBRARY -DSK_SUPPORT_GPU=1 "-DSK_GPU_WORKAROUNDS_HEADER="gpu/config/gpu_driver_bug_workaround_autogen.h"" -DGR_GL_FUNCTION_TYPE=__stdcall -DU_USING_ICU_NAMESPACE=0 -DU_ENABLE_DYLOAD=0 -DU_STATIC_IMPLEMENTATION -DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE -DUCHAR_TYPE=wchar_t "-DFT_CONFIG_CONFIG_H="freetype-custom-config/ftconfig.h"" "-DFT_CONFIG_MODULES_H="freetype-custom-config/ftmodule.h"" "-DFT_CONFIG_OPTIONS_H="freetype-custom-config/ftoption.h"" -DPDFIUM_REQUIRED_MODULES -DCHROMIUM_RESTRICT_VISIBILITY -I../.. -Igen -I../../third_party/libwebp/src -I../../skia/config -I../../skia/ext -I../../third_party/skia/include/c -I../../third_party/skia/include/config -I../../third_party/skia/include/core -I../../third_party/skia/include/effects -I../../third_party/skia/include/encode -I../../third_party/skia/include/gpu -I../../third_party/skia/include/images -I../../third_party/skia/include/lazy -I../../third_party/skia/include/pathops -I../../third_party/skia/include/pdf -I../../third_party/skia/include/pipe -I../../third_party/skia/include/ports -I../../third_party/skia/include/utils -I../../third_party/skia/src/gpu -I../../third_party/skia/src/sksl -I../../third_party/skia/modules/skottie/include -I../../third_party/icu/source/common -I../../third_party/icu/source/i18n -I../../third_party/ced/src -I../../third_party/zlib -I../../third_party/freetype/include -I../../third_party/freetype/src/include -I../../third_party/harfbuzz-ng/src/src /utf-8 /X -fcolor-diagnostics -fmerge-all-constants -Xclang -mllvm -Xclang -instcombine-lower-dbg-declare=0 -no-canonical-prefixes -fcomplete-member-pointers /Gy /FS /bigobj /d2FastFail /Zc:sizedDealloc- -fmsc-version=1911 -m64 /Brepro /W4 -Wimplicit-fallthrough -Wthread-safety /WX /wd4091 /wd4127 /wd4251 /wd4275 /wd4312 /wd4324 /wd4351 /wd4355 /wd4503 /wd4589 /wd4611 /wd4100 /wd4121 /wd4244 /wd4505 /wd4510 /wd4512 /wd4610 /wd4838 /wd4995 /wd4996 /wd4456 /wd4457 /wd4458 /wd4459 /wd4200 /wd4201 /wd4204 /wd4221 /wd4245 /wd4267 /wd4305 /wd4389 /wd4702 /wd4701 /wd4703 /wd4661 /wd4706 /wd4715 /wd4702 -Wno-missing-field-initializers -Wno-unused-parameter -Wno-c++11-narrowing -Wno-covered-switch-default -Wno-unneeded-internal-declaration -Wno-undefined-var-template -Wno-nonportable-include-path -Wno-user-defined-warnings -Wno-unused-lambda-capture -Wno-null-pointer-arithmetic -Wno-enum-compare-switch -Wno-ignored-pragma-optimize /O1 /Ob2 /Oy- /Zc:inline /Gw /Oi /Z7 -fno-standalone-debug /MT -Xclang -add-plugin -Xclang find-bad-constructs -Xclang -plugin-arg-find-bad-constructs -Xclang enforce-in-thirdparty-webkit -Xclang -plugin-arg-find-bad-constructs -Xclang check-enum-max-value -Wheader-hygiene -Wstring-conversion -Wtautological-overlap-compare /wd4267 /TP /wd4577 /GR- /c ../../ui/gfx/font_fallback_win.cc /Foobj/ui/gfx/gfx/font_fallback_win.obj /Fd"obj/ui/gfx/gfx_cc.pdb"
In file included from ../../ui/gfx/font_fallback_win.cc:9:
In file included from ..............Program Files (x86)Windows Kits10include10.0.17134.0winrtwrl.h:18:
..............Program Files (x86)Windows Kits10include10.0.17134.0umwrlevent.h(228,112): error: use of undeclared identifier DefaultDelegateCheckMode

— в файле C:Program Files (x86)Windows Kits10include10.0.17134.0umwrlevent.h

отредактируйте строки 228 и 1199 (так делать не очень хорошо, но не остаётся выбора). На строке #228 вместо:

template<typename TDelegateInterface, typename TCallback, unsigned int argCount, DelegateCheckMode checkMode = DefaultDelegateCheckMode>

указать:

template<typename TDelegateInterface, typename TCallback, unsigned int argCount, DelegateCheckMode checkMode>

на строке #1199 вместо:

extern __declspec(selectany) const DelegateCheckMode DefaultDelegateCheckMode = NoCheck;

указать:

extern __declspec(selectany) const DelegateCheckMode;

, после чего удалить текущую зафейленную сборку chromedriver и заново перекомпилировать.

Если компиляция прошла успешно, то положите обновлённый chromedriver.exe в C:/Windows и сначала проверьте, что в браузере Chrome по-прежнему успешно исполняются автотесты, при успехе — проверьте работоспособность в браузере Спутник.

Предполагаю, что ныне обновлённый chromedriver будет работать с любым браузером на движке Chromium.

  • 16 янв 2018 2018-01-16 10:36:18