#node.js #linux #docker #selenium #selenium-chromedriver
#node.js #линукс #докер #селен #селен-хромированный привод
Вопрос:
У меня есть скрипт автоматизации, написанный на JavaScript NodeJS, который использует chromedriver и selenium-webdriver. Он отлично работает в Windows, но в контейнере Docker он дает исключение ElementNotFoundException. Версия chrome и версия chromedriver совпадают.
Ниже приведен файл JavaScript:
require("chromedriver"); const {By,Key,Builder} = require("selenium-webdriver"); const chrome = require('selenium-webdriver/chrome'); async function functionA(){ const url = "abcd.com"; var cCode; //To wait for browser to build and launch properly let driver = await new Builder() .forBrowser("chrome") .setChromeOptions(new chrome.Options().addArguments(['--no-sandbox','--headless', '--disable-dev-shm-usage'])) .build(); await driver.get(url); const wait = ms =gt; new Promise(resolve =gt; setTimeout(resolve, ms)); await wait(1 * 20 * 1000); await driver.manage().window().setRect({ width: 1552, height: 840 }); await driver.findElement(By.id("email")).click(); await driver.findElement(By.id("email")).sendKeys("abcd"); var sName = await driver.findElement(By.id("email")).getText(); console.log("sName is: " sName); await driver.findElement(By.id("submitbutton")).click(); //this.timeout(1.33 * 20 * 1000); await wait(1 * 20 * 1000); //It is always a safe practice to quit the browser after execution await driver.quit(); //console.log(cCode); return 'some code; } async function testFunctionA() { var result = await functionA(); console.log(result); } testFunctionA();
Приведенный выше скрипт вызывается с помощью скрипта bash.
#!/bin/bash v=$(node ./test/executeScript.js) echo "$v"
Этот сценарий оболочки вызывается через docker:
FROM timbru31/node-chrome USER root RUN node --version RUN npm --version RUN apt-get update RUN mkdir /data COPY . /dataRUN npm --prefix /data install RUN apt-get install -y apt-utils RUN google-chrome --product-version ADD /test /data/test ADD /load-test /data/load-test RUN ls -a RUN SAUTH=$(sh /data/bashScript.sh)
Теперь, когда я запускаю этот файл docker, я получаю следующее исключение
(node:8) UnhandledPromiseRejectionWarning: NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"*[id="emailInput"]"} (Session info: headless chrome=96.0.4664.93) at Object.throwDecodedError (/data/node_modules/selenium-webdriver/lib/error.js:517:15) at parseHttpResponse (/data/node_modules/selenium-webdriver/lib/http.js:643:13) at Executor.execute (/data/node_modules/selenium-webdriver/lib/http.js:569:28) at processTicksAndRejections (internal/process/task_queues.js:95:5) at async Driver.execute (/data/node_modules/selenium-webdriver/lib/webdriver.js:732:17) at async toWireValue (/data/node_modules/selenium-webdriver/lib/webdriver.js:140:15) at async /data/node_modules/selenium-webdriver/lib/webdriver.js:190:16 at async forEachKey (/data/node_modules/selenium-webdriver/lib/webdriver.js:184:9) at async convertKeys (/data/node_modules/selenium-webdriver/lib/webdriver.js:189:3) at async Driver.execute (/data/node_modules/selenium-webdriver/lib/webdriver.js:730:22) (Use `node --trace-warnings ...` to show where the warning was created) (node:8) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1) (node:8) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. Command-line options | Node.js v17.2.0 Documentation
Пожалуйста, обратите внимание, что javascript отлично работает в Windows. Все проблемы возникают в docker. Какова может быть возможная причина и решение для решения этой проблемы?
Комментарии:
1. Я думаю, вам следует установить размеры окна драйвера достаточно большими. Размер экрана по умолчанию в безголовом режиме довольно мал
2. Все команды ЗАПУСКА выполняются во время сборки контейнера, а не во время выполнения. SAUTH не будет доступен при выполнении фактического сценария. Не уверен, имеет ли это значение, так как, похоже, оно не используется в вашем JavaScript.