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

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

Вкратце: используем selenium+codeception, в 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://habr.com/company/jugru/blog/347024/

chromedriver (скачать свежую версию и поместить в C:/Windows): https://chromedriver.storage.googleapis.com/index.html
chromium: GitHub - chromium/chromium: The official GitHub mirror of the Chromium source

Выкачиваем репозиторий chromium, устанавливаем Visual Studio (для C++), выбираем пакеты самого свежего SDK, пакеты MFC- и ATL-поддержки, “Debugging Tools For Windows”, Windows Driver Kit (WDK) https://go.microsoft.com/fwlink/?linkid=873060 . Устанавливаем depot tools https://storage.googleapis.com/chrome-infra/depot_tools.zip

обязательно в гите прописываем:

$ 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

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

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

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

Если встретите странные ошибки в процессе выполнения 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 нужен во избежание ошибки: [Facebook\WebDriver\Exception\UnknownServerException] unknown error: Devtools port number file contents \<50250> were in an unexpected format.
Заранее предупрежу, что не надо использовать параметр window_size, т.к. Chromium не поддерживает его, иначе встретим ошибку: [Facebook\WebDriver\Exception\UnknownServerException] unknown error: unhandled inspector error: {"code":-32601,"message":"'Browser.getWindowForTarget' wasn't found"}

При запуске автотестов на Спутнике, мы должны увидеть ошибку: [Facebook\WebDriver\Exception\UnknownServerException] unknown error: unrecognized Chrome version: SputnikBrowser/3.5.2152.0 (GOST)

— бесполезно в экзешнике спутника перезаписывать информацию о продукте в соответствии с Chrome, т.к. в этом случае экзешник станет невалидным, при попытке запуска увидим ошибку “Не удалось запустить приложение, поскольку его параллельная конфигурация неправильна”, а при запуске автотестов встретим ошибку:

[Facebook\WebDriver\Exception\UnknownServerException] unknown error: Failed to create a Chrome process.

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

Проверьте, что действительно можете скопилировать chromedriver из исходников:
d:\chromium\src> ninja -C out/Default chromedriver

если всё ок, то файл будет располагаться здесь:
d:\chromium\src\out\Default\chromedriver.exe

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

return error;

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

return Status(kOk);

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

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

[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 Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\ATLMFC\include" "-imsvc..\..\..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\include" "-imsvc..\..\..\..\..\..\..\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt" "-imsvc..\..\..\..\..\..\..\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\shared" "-imsvc..\..\..\..\..\..\..\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\um" "-imsvc..\..\..\..\..\..\..\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\winrt" "-imsvc..\..\..\..\..\..\..\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\cppwinrt" -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 Kits\10\include\10.0.17134.0\winrt\wrl.h:18: ..\..\..\..\..\..\..\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\um\wrl\event.h(228,112): error: use of undeclared identifier 'DefaultDelegateCheckMode'

— в файле C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\um\wrl\event.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.

2 лайка

могу я спросить, для чего?
51

взято из Спутник (поисковая система) — Википедия

Требование заказчика, в виду поддержки криптографии

Возможно проще будет собрать chromium с поддержкой ГОСТ - GitHub - deemru/Chromium-Gost: Chromium с поддержкой алгоритмов ГОСТ