NodeJS Javascript — ChromeDriver — Скрипт отлично работает в Windows. В окне настройки дается исключение ElementNotFoundException

#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.