nikita.kopot 06 ноября 2020

πŸ¦‰ ИспользованиС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Nightwatch.js для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ тСстирования

Selenium совмСстим с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ инструмСнтариями ΠΈ языками программирования – ΠΎΠ½ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½ΠΎΠ³ΠΎ тСстирования. Если Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Selenium ΠΈ JavaScript, Π΅ΡΡ‚ΡŒ особСнный Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ – Nightwatch.js, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅.
πŸ¦‰ ИспользованиС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Nightwatch.js для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ тСстирования

ΠŸΠ΅Ρ€Π΅Π΄ Π²Π°ΠΌΠΈ пошаговоС руководство ΠΊ Nightwatch.js для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½ΠΎΠ³ΠΎ тСстирования. ΠœΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ, ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ рассмотрим Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ структуру Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΏΠ°ΠΏΠΎΠΊ. ПозТС ΠΈΠ·ΡƒΡ‡ΠΈΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ скрипта Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ тСстирования, Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ ΠΏΠΎΠΈΡ‰Π΅ΠΌ ΠΏΡƒΡ‚ΠΈ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Nightwatch.js?

Nightwatch.js – написанный Π½Π° Node.js ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ инструмСнтарий, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π° прСдоставлСниС ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ³ΠΎ сквозного (end-to-end) тСстирования Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π²Π΅Π±-сайтов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Selenium ΠΈ JavaScript. Он прСдоставляСт нСсколько ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ для выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с элСмСнтами DOM.

Nightwatch.js ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ API W3C WebDriver ΠΈΠ»ΠΈ Selenium WebDriver, ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ написаниС сквозных автоматичСских тСстов Π² Node.js, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π»Π΅Π³ΠΊΠΎ настраиваСтся для Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Nightwatch.js Ρ‚Π°ΠΊ популярСн?

Основная Ρ†Π΅Π»ΡŒ Nightwatch.js – созданиС Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для тСстирования ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ написан Π½Π° Node.js, Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вСсомыС прСимущСства ΠΏΠ΅Ρ€Π΅Π΄ Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ инструмСнтом Selenium.

АвтоматизированноС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½ΠΎΠ΅ тСстированиС Π½Π° Π±Π°Π·Π΅ Nightwatch.js устраняСт Ρ„Π°ΠΊΡ‚ΠΎΡ€ зависимости ΠΎΡ‚ стороннСго ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ систСмными ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ.

Nightwatch.js прСдоставляСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ возмоТности ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ:

  • ВстроСнный Test Runner: Π½Π°Π±ΠΎΡ€ срСдств запуска тСстирования ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Grunt для выполнСния Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… тСстов;
  • БтратСгия тСстирования: ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы запуска тСстов (ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎ Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌ ΠΈ Ρ‚Π΅Π³Π°ΠΌ).
  • ΠžΠ±Π»Π°Ρ‡Π½Ρ‹Π΅ сСрвисы: ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°ΠΌΠΈ ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠ³ΠΎ тСстирования Π½Π° Selenium, Ρ‚Π°ΠΊΠΈΠΌΠΈ, ΠΊΠ°ΠΊ LambdaTest.
  • Selenium Server: Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ автоматичСского управлСния Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΌ сСрвСром Selenium с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнной отчСтности JUnit XML.
  • УтвСрТдСния, CSS ΠΈ XPath: Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ утвСрТдСния для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ DOM, Π° Ρ‚Π°ΠΊΠΆΠ΅ сСлСкторы CSS ΠΈ XPath, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ элСмСнтов Π½Π° страницС.
  • НСпрСрывная интСграция: Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ тСстов с систСмами Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ сборки (Jenkins, TeamCity ΠΈ Ρ‚.ΠΏ.).

Помимо пСрСчислСнных Π²Ρ‹ΡˆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Nightwatch.js популярСн благодаря чистому ΠΈ простому синтаксису, ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰Π΅ΠΌΡƒ быстроС ΠΈ эффСктивноС написаниС тСстов с использованиСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ CSS-сСлСкторов Node.js ΠΈ XPath Π»ΠΎΠΊΠ°Ρ‚ΠΎΡ€Π° Π² Selenium.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Nightwatch.js

Nightwatch обмСниваСтся Π΄Π°Π½Π½Ρ‹ΠΌΠΈ посрСдством RESTful API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСтся W3C WebDriver API. Π•ΠΌΡƒ Π½ΡƒΠΆΠ΅Π½ RESTful HTTP API ΠΈ сСрвСр Selenium JavaScript WebDriver.

Для выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΠ»ΠΈ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅, Nightwatch ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ трСбуСтся ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π΄Π²Π° запроса:

  • ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ запрос Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ элСмСнт с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ XPath ΠΈΠ»ΠΈ CSS сСлСктором.
  • Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ элСмСнт ΠΈ выполняСт Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ»ΠΈ утвСрТдСния.

Установка Nightwatch.js

Π•ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ условия, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Nightwatch.js:

  • Node.js: ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Nightwatch написан Π½Π° Node.js, Π·Π½Π°Ρ‡ΠΈΡ‚ потрСбуСтся сСрвСрная ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°.
  • ΠŸΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Node (npm): ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Node.js установлСн, Node package manager ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для установки ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½ΡΡ‚Π°Π»Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ инструмСнтария, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ (здСсь β€˜g’ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для глобальной установки):

        $ npm install -g nightwatch
    

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Π°Ρ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° помСстит исполняСмый Ρ„Π°ΠΉΠ» (β€˜--save-dev’) Π² ΠΏΠ°ΠΏΠΊΡƒ ./node_modules/.bin

        $ npm install --save-dev nightwatch
    
  • Java SDK: ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Nightwatch Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Selenium WebDriver API ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Selenium WebDriver Server, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Java Development Kit (JDK 7+) ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ срСду JAVA.
  • Selenium Server: трСбуСтся Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ сСрвСрный ΠΏΠ°ΠΊΠ΅Ρ‚ Selenium JAR, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π½Π° страницС Π·Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ Selenium. Π—Π°Ρ‚Π΅ΠΌ Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΏΠ°ΠΏΠΊΡƒ bin ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Selenium Server запускаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
        selenium-server-standalone-{version}.jar
    


  • ChromeDriver: являСтся Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΌ сСрвСром, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» W3C Web Driver для Chromium. Π­Ρ‚ΠΎΡ‚ исполняСмый Ρ„Π°ΠΉΠ» Π½Π°Π΄ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² Ρ‚Ρƒ ΠΆΠ΅ ΠΏΠ°ΠΏΠΊΡƒ bin.
        $ npm install --save-dev chromedriver</pre>
    


Настройка Nightwatch.js

Π€Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ встроСнный Test Runner, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ JSON. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ nightwatch.json, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ nightwatch.conf.js, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ ΠΈΠ· ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° для тСстирования Π½Π° Nightwatch.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
Если Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ±Π° Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π² ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ nightwatch.conf.js, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΎΠΊ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ.

Π’ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈ: срСды тСстирования, спСцифичСскиС настройки Selenium ΠΈ Ρ‚.Π΄. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ выглядит Ρ„Π°ΠΉΠ» nightwatch.json для тСстирования с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Selenium ΠΈ JavaScript.

        { "src_folders" : ["tests"], "output_folder" : "reports", "custom_commands_path" : "", "custom_assertions_path" : "", "page_objects_path" : "", "globals_path" : "", "test_workers": { "enabled": true, "workers": "auto" }, "selenium" : { "start_process" : true, "server_path" : "node_modules/selenium-standalone/.selenium/selenium-server/", "log_path" : "./reports", "host": "127.0.0.1", "port" : 4444, "cli_args" : { "webdriver.chrome.driver" : "", "webdriver.gecko.driver" : "", "webdriver.edge.driver" : "" } }, "test_settings" : { "default" : { "launch_url" : "http://localhost", "selenium_port" : 4444, "selenium_host" : "localhost", "silent": true, "screenshots" : { "enabled" : false, "path" : "" }, "desiredCapabilities": { "browserName": "firefox", "marionette": true, "javascriptEnabled": true, "acceptSslCerts": true } }, "chrome" : { "desiredCapabilities": { "browserName": "chrome" } }, "edge" : { "desiredCapabilities": { "browserName": "MicrosoftEdge" } } } }
    

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ рассмотрим Π΅Π³ΠΎ структуру:

  • src_folders: ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Π½Π° мСстополоТСниС тСстовых Π½Π°Π±ΠΎΡ€ΠΎΠ² дирСктория.
  • output_folder: здСсь хранятся ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ тСстирования, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„Π°ΠΉΠ»Ρ‹ JUnit с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ, ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ Π² XML, Π»ΠΎΠ³ΠΈ, Π»ΠΎΠ³ΠΈ selenium, ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Ρ‹, Π²ΠΈΠ΄Π΅ΠΎ, сСтСвыС Π»ΠΎΠ³ΠΈ ΠΈ Ρ‚.Π΄.
  • globals_path: ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ всС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ тСстового Π½Π°Π±ΠΎΡ€Π°. Они Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² тСстах, ΠΊΠ°ΠΊ глобальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Π² срСдС test_settings.
  • test_workers: это свойство опрСдСляСт, Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ тСсты ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Если для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° enabled установлСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, распараллСливаниС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ.
  • page_objects_path: ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ мСсто, ΠΎΡ‚ΠΊΡƒΠ΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» страницы.
  • selenium: содСрТит всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈ настройки, относящиСся ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Selenium Server. Он Ρ‚Π°ΠΊΠΆΠ΅ содСрТит server_path ΠΈ webdriver.chrome.driver, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΡƒΡ‚ΡŒ ΠΊ Selenium Server ΠΈ ChromeDriver. Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ start_process Π·Π°Π΄Π°Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Selenium Server запускаСтся автоматичСски.
  • test_settings: содСрТит всю Π²Π°ΠΆΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ тСстах ΠΈ ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ…. Π­Ρ‚ΠΎ позволяСт Π½Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ тСстовыС срСды.

Запуск ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ скрипта Π½Π° локальном Selenium WebDriver

Наш тСстовый сцСнарий Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Nightwatch Π² Google, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ nightwatch.js Π½Π° Π²Π΅Π±-сайтС.

        module.exports = { 'NW test on Google' : function (client) { client .url('http://www.google.com') .waitForElementVisible('body', 1000) .assert.title('Google') .assert.visible('input[type=text]') .setValue('input[type=text]', 'Nightwatch JS') .waitForElementVisible('button[name=btnG]', 1000) .click('button[name=btnG]') .pause(1000) .assert.containsText('ol#rso li:first-child', 'Nightwatch.js | Node.js powered End-to-End testing framework') .end() } }

    

Π€Π°ΠΉΠ» nightwatch.json (ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» модуля nightwatch.globals.js) ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

        { "src_folders" : ["./tests"], "output_folder" : "./reports", "globals_path" : "nightwatch.globals.js", "test_workers": { "enabled": true, "workers": "auto" }, "selenium" : { "start_process" : true, "server_path" : "./node_modules/selenium-server-standalone-jar/jar/selenium-server-standalone-3.141.59.jar", "log_path" : "nw/logs", "host" : "127.0.0.1", "port" : 4444, "cli_args" : { "webdriver.chrome.driver" : "./node_modules/chromedriver/bin/chromedriver", "webdriver.ie.driver" : "" } }, "test_settings" : { "default" : { "launch_url" : "http://google.com", "selenium_port" : 4444, "selenium_host" : "localhost", "silent": true, "screenshots" : { "enabled" : true, "path" : "" }, "desiredCapabilities": { "browserName": "chrome", "javascriptEnabled": true, "acceptSslCerts": true } }, "french" : { "launch_url" : "http://google.fr", "desiredCapabilities": { "browserName": "firefox", "javascriptEnabled": true, "acceptSslCerts": true } } } }
    

Π”Π°Π»Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ тСстированиС Nightwatch ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

`npm test`

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° провСряСт тСсты ΠΈ зависимости, Π° Π·Π°Ρ‚Π΅ΠΌ выполняСт тСстовый Π½Π°Π±ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π² Chrome Π·Π°Π΄Π°Π½Π½ΡƒΡŽ строку поиска.

πŸ¦‰ ИспользованиС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Nightwatch.js для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ тСстирования

ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ тСстированиС Π½Π° локальном Selenium WebDriver

Настроим ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния тСстирования, установив для test_workers Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true. Π’ ΠΏΠ°ΠΏΠΊΡƒ тСстов потрСбуСтся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½, ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Nightwatch.js Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΈΡ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ тСст Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Node.js Π² Google ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Node.js.

        module.exports = { 'NJS test on Google' : function (client) { client .url('http://www.google.com') .waitForElementVisible('body', 1000) .assert.title('Google') .assert.visible('input[type=text]') .setValue('input[type=text]', 'node.js') .waitForElementVisible('button[name=btnG]', 1000) .click('button[name=btnG]') .pause(1000) .assert.containsText('ol#rso li:first-child', 'Node.js') .end() } }
    

Оба тСста выполнятся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π² Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… Chrome.

πŸ¦‰ ИспользованиС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Nightwatch.js для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ тСстирования

ВСстовоС ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅

ΠŸΡ€ΠΎΠ²ΠΎΠ΄Ρ тСстированиС Π²Π΅Π±-прилоТСния Π½Π° локальном хостС, ΠΌΡ‹ стрСмимся ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ интСрфСйсом ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ внСсти ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ измСнСния, Π° Π·Π°Ρ‚Π΅ΠΌ пСрСнСсти ΠΊΠΎΠ΄ Π½Π° live-сСрвСр для получСния ΠΆΠΈΠ²ΠΎΠ³ΠΎ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°. Π’ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° – тСстовоС ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅.

Π’ основном ΠΎΠ½Π° связана с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² установлСнных локально Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ…. Для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ кроссбраузСрного тСстирования Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм с локальной инфраструктурой нСльзя.

Π—Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ инфраструктуру

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… автоматичСских тСстов ΠΈ локальная настройка Selenium всСгда сопровоТдаСтся Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ Π½Π° инфраструктуру.

  • Для выполнСния всСх тСстовых Π·Π°Π΄Π°Ρ‡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ срСду;
  • Π’Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ устройств: дСсктопы, Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠΈ, смартфоны ΠΈ ΠΏΠ»Π°Π½ΡˆΠ΅Ρ‚Ρ‹;
  • Π˜Π½Π²Π΅ΡΡ‚ΠΈΡ†ΠΈΠΈ Π² установку Ρ„Π΅Ρ€ΠΌΡ‹ устройств – Π½Π΅ Π»ΡƒΡ‡ΡˆΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€ для стартапов ΠΈ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΉ;
  • ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ количСство Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… тСстов ΠΌΠΎΠΆΠ΅Ρ‚ возрасти, Π½ΡƒΠΆΠ½Π° ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ систСма.

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ ΠΈΠ»ΠΈ симулятор для выполнСния локального Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ тСстирования Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ ΠΈ это ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… Π·Π°Ρ‚Ρ€Π°Ρ‚, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ обслуТивания.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹ΠΉ Selenium Grid – Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€?

ΠžΠ±Π»Π°Ρ‡Π½Π°Ρ инфраструктура ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ сотням ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Ρ… Π½Π° сСрвСрах ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°. Π’Ρ‹ ΠΈΠ·Π±Π°Π²ΠΈΡ‚Π΅ΡΡŒ ΠΎΡ‚ Ρ…Π»ΠΎΠΏΠΎΡ‚ ΠΏΠΎ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Π½ΠΈΡŽ ΠΈ смоТСтС Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ тСст с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ простоя. Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ прСимущСство ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠ³ΠΎ тСстирования – ΡƒΠΆΠ΅ настроСнная с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² адаптивная срСда, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ тСсты с использованиСм любой структуры Π² соотвСтствии с трСбованиями.

Облако ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ высокой ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒΡŽ ΠΈ позволяСт ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ любоС количСства тСстов. Для принятия Π½ΠΎΠ²ΠΎΠΉ стратСгии достаточно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ тСстовыС скрипты, Π° настройка инфраструктуры останСтся ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΉ.

Какой Selenium Grid Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ?

200 000 ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ ΠΏΠΎ всСму ΠΌΠΈΡ€Ρƒ Π΄ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ LambdaTest ΠΊΠ°ΠΊ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΌΡƒ ΠΎΠ½Π»Π°ΠΉΠ½-ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρƒ Selenium Grid. БСрвис позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ тСстированиС Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ 2000 Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² для ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΈ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ².

ΠžΠ±Π»Π°Ρ‡Π½Ρ‹ΠΉ Selenium Grid позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ скрипты Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ тСстирования Π² Selenium Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… программирования: Java, JavaScript, PHP, Python, Ruby, C # ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… языках, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ привязку ΠΊ Selenium.

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ инструмСнтами CI/CD (Jenkins, Travis CI ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ) для Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ тСстирования Π² DevOps.

Благодаря ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌΡƒ Selenium API Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ скрипта Selenium Ρ‡Π΅Ρ€Π΅Π· LambdaTest. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ WebDriver для LambdaTest Selenium Grid.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ скрипта Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ Selenium Grid

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ тСстовый скрипт ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² всСго нСсколько строк ΠΊΠΎΠ΄Π°. Для Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ Selenium Webdriver вмСсто локального.

Π—Π°Ρ‚Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ срСду Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° для выполнСния тСстов, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π΄Π°Π½Π½Ρ‹Π΅ Π² LambdaTest Selenium Grid Ρ‡Π΅Ρ€Π΅Π· Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ класс возмоТностСй. Он прСдоставляСт Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ возмоТностСй (Desired Capabilities Generator) для Π²Ρ‹Π±ΠΎΡ€Π° ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ свСдСний ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΈ спСцификаций срСды с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ комбинациями.

πŸ¦‰ ИспользованиС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Nightwatch.js для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ тСстирования

Класс desiredCapabilities Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ nightwatch.json для тСстирования Nightwatch Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

        "desiredCapabilities": { "build" : "Nightwatch-Selenium-Test", "name" : "Nightwatch-Selenium-Test", "platform" : "Windows 10", "browserName" : "Firefox", "version" : "71.0", "selenium_version" : "3.4.0", "geoLocation" : "IN" }

    

Нам Ρ‚Π°ΠΊΠΆΠ΅ понадобится ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ доступа для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ ΠΈ выполнСния тСстирования. Он ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ скопирован ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° профиля ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи.

πŸ¦‰ ИспользованиС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Nightwatch.js для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ тСстирования

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ доступа, имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ свСдСния ΠΎ Ρ…Π°Π±Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Automation.

πŸ¦‰ ИспользованиС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Nightwatch.js для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ тСстирования

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Ρ„Π°ΠΉΠ» nightwatch.conf.js, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для ΠΊΠ»ΡŽΡ‡Π° доступа, ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, хоста ΠΈ ΠΏΠΎΡ€Ρ‚Π° для тСста.

        module.exports = (function(settings) { console.log(settings["test_settings"]["default"]["username"]) if (process.env.LT_USERNAME) { settings["test_settings"]["default"]["username"] = process.env.LT_USERNAME; } if (process.env.LT_ACCESS_KEY) { settings["test_settings"]["default"]["access_key"] = process.env.LT_ACCESS_KEY; } if (process.env.SELENIUM_HOST) { settings.selenium.host = process.env.SELENIUM_HOST; } if (process.env.SELENIUM_PORT) { settings.selenium.host = process.env.SELENIUM_PORT; } return settings; })(require('./nightwatch.json'));

    

Π‘Ρ‚ΠΎΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ тСсты Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах: ΠΌΡ‹ использовали Microsoft Edge, Mozilla Firefox ΠΈ Apple Safari Π½Π° Windows 10 ΠΈ OS X 10.13.

ПослС внСсСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

        { "src_folders" : ["./tests"], "output_folder" : "./reports", "globals_path" : "nightwatch.globals.js", "test_workers": { "enabled": true, "workers": "auto" }, "selenium" : { "start_process" : false, "server_path" : "", "log_path" : "", "host" : "hub.lambdatest.com", "port" : 80, "cli_args" : { "webdriver.chrome.driver" : "", "webdriver.ie.driver" : "", "webdriver.firefox.profile" : "" } }, "test_settings" : { "default" : { "launch_url" : "http://google.com", "selenium_port" : 80, "selenium_host" : "https://lambdatest.com", "silent": false, "screenshots" : { "enabled" : true, "path" : "" }, "username" : "irohitgoyal", "access_key" : "123456789", "skip_testcases_on_fail": false, "desiredCapabilities": { "build":"Nightwatch-Selenium--Test", "platform" : "Windows 10", "browserName" : "Chrome", "version" : "78.0", "selenium_version" : "3.13.0", "visual":true, "video":true, "console":true, "geoLocation" : "IN", "chrome.driver" : "78.0", "network":true } }, "chrome": { "desiredCapabilities": { "platform": "Windows 10", "browserName": "chrome", "version": "78.0" } }, "safari" : { "desiredCapabilities": { "platform": "macos 10.13", "browserName": "safari", "version": "11.0" } }, "firefox" : { "desiredCapabilities": { "platform": "win10", "browserName": "firefox", "version": "60" } }, "edge" : { "desiredCapabilities": { "platform": "Windows 10", "browserName": "MicrosoftEdge", "version": "17.0" } }, "french" : { "launch_url" : "http://google.fr", "desiredCapabilities": { "browserName": "firefox", "javascriptEnabled": true, "acceptSslCerts": true } } } }

    

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Π°ΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ Ρ€Π°Π·Π΄Π΅Π» для тСстирования Nightwatch Π² класс scripts Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² Ρ„Π°ΠΉΠ»Π΅ package.json, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ срСды выполнСния desired compabilities.

        scripts": { "test": "./node_modules/.bin/nightwatch -e firefox,edge,safari test" },
    

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ тСсты ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

npm test

Она выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ тСстов ΠΈ зависимостСй, Π° Π·Π°Ρ‚Π΅ΠΌ запускаСт тСсты ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ Edge, Firefox ΠΈ Safari Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… срСдах ΠΈ Π²Π²ΠΎΠ΄ΠΈΡ‚ строку поиска. На ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΊΠΎΠ΄ Nightwatch, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π² LambdaTest Selenium Grid.

πŸ¦‰ ИспользованиС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Nightwatch.js для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ тСстирования

Π‘ΠΊΡ€ΠΈΠΏΡ‚ запускаСтся ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π² Mozilla Firefox, Safari, Google Chrome ΠΈ Edge, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΠΈ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ LambdaTest. ПанСль инструмСнтов LambdaTest позволяСт ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ, ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Ρ‹ ΠΈ видСозаписи всСх Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… Π½Π° Selenium тСстов.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Nightwatch.js позволяСт быстро Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ кроссбраузСрных тСстов с минимальной настройкой. Π›ΡƒΡ‡ΡˆΠ°Ρ прСдоставляСмая Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠΌ функция – эффСктивноС ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ тСстированиС кСйсов, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ΠΈΠ»ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅. На Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ этапС Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Π½ΠΎ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ процСсс ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС прСимущСства Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ тСстирования Π½Π° Selenium Π±Π΅Π· Π»ΠΈΡˆΠ½ΠΈΡ… Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов.

***

Π₯ΠΎΡ‡Ρƒ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с нуля, Π½ΠΎ Π½Π΅ знаю, с Ρ‡Π΅Π³ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ. Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ?

МоТно ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ (Π΄ΠΎΠ»Π³ΠΎ) ΠΈΠ»ΠΈ ΠΏΠΎΠΉΡ‚ΠΈ Π½Π° курсы с прСподаватСлями (быстро). Плюс Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄ΠΆΡƒΠ½ΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎ, конкурСнция Π²Ρ‹ΡˆΠ΅ ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΎΠ΄Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‚ ΠΏΠΎΡ€ΠΎΠ³ вхоТдСния ΠΏΡ€ΠΈ Π½Π°ΠΉΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ знания, ΠΌΡ‹ Π² proglib.academy запустили курсы:

  • ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π½Π° Python.
  • ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΡ Python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ.
  • Алгоритмы ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ….
  • ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ° для Data Science.
  • ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΡ Data Science.
  • Frontend Basic: ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ соврСмСнного Π²Π΅Π±Π°.
  • ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΡ Π€Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ.
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° СстСствСнного языка. ΠŸΠΎΠ»Π½Ρ‹ΠΉ курс.

На ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ Π΅Ρ‰Π΅ большС 10 курсов для взрослых ΠΈ Π΄Π΅Ρ‚Π΅ΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

ΠœΠ•Π ΠžΠŸΠ Π˜Π―Π’Π˜Π―

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•