🐍 Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ автотСст Web UI Π½Π° Python ΠΈ Selenium Π·Π° 7 шагов: инструкция для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Π±-интСрфСйсы ΠΈ Π»ΠΎΠ³ΠΈΠΊΡƒ отобраТСния графичСских Π±Π»ΠΎΠΊΠΎΠ² Π½Π° страницС ΠΈΠ»ΠΈ просто Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅, эта ΡΡ‚Π°Ρ‚ΡŒΡ для вас. Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΏΠΎ созданию автотСста Π½Π° Python ΠΈ Selenium Π·Π° 7 простых шагов.

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Selenium совмСстно с Python вСрсий 3.x.x. ЦСль ΡΡ‚Π°Ρ‚ΡŒΠΈ – Π½Π΅ Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ знания ΠΏΠΎ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ программирования ΠΈ написания автотСстов, Π° Π·Π°ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ Π² этой области ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΠΈΡˆΡƒΡ‚ΡΡ Π² Ρ†Π΅Π»ΠΎΠΌ.

1. Установка Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

Для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°ΠΌ потрСбуСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Python Π½Π° Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ.

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ сайт Python ΠΈ ΠΊΠ°Ρ‡Π°Π΅ΠΌ установщик для вашСй ОБ (ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Windows). Π’ процСссС инсталляции ΠΏΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π³Π°Π»ΠΎΡ‡ΠΊΠΈ Π½Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² систСмныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ PATH. Π”ΠΎΠΆΠ΄ΠΈΡ‚Π΅ΡΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса, ΠΈ Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° попросит ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ΡΡŒ. Если Ρƒ вас Linux, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² систСмС, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС стоит ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· рСпозитория ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² вашСго дистрибутива.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ установки, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» (Π² Windows Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Win+R ΠΈ запуститС cmd ΠΈΠ»ΠΈ Alt+Ctrl+T Π² графичСской срСдС Linux). Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

python --version
Рис. 1. Π”ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π²Π΅Π΄Π΅Π½Π° вСрсия, Π° Ссли Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎ шагам ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ

Π”Π°Π»Π΅Π΅ Π½Π°ΠΌ понадобится сам Selenium:

pip install selenium

Π”ΠΎΠΆΠ΄ΠΈΡ‚Π΅ΡΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ установки. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ тСст, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ популярной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ pytest. УстанавливаСтся ΠΎΠ½Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ:

pip install pytest
Для создания ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½ΡƒΠΆΠ½Π° интСгрированная срСда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ»ΠΈ IDE (integrated development environment), Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ тСкстовом Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅. Π― Π²Ρ‹Π±Ρ€Π°Π» ΡΠ°ΠΌΡƒΡŽ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΡƒΡŽ ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ срСду PyCharm ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ JetBrains.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠΌ, ΠΏΠΎΠΌΠΈΠΌΠΎ Selenium потрСбуСтся Π²Π΅Π±-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€: Π² нашСм случаС ChromeDriver – ΠΏΠΎ сути это ΡΠ²ΡΠ·ΡƒΡŽΡ‰Π΅Π΅ Π·Π²Π΅Π½ΠΎ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ вСрсия Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ вСрсии Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° ΠΈ Π²ΠΏΠ΅Ρ€Π΅Π΄ – ΠΊ созданию ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ написанию ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ скрипта.

2. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ скрипт с использованиСм Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°

ВсС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹, Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Для этого запускаСм PyCharm ΠΈ Π² ΠΎΡ‚ΠΊΡ€Ρ‹Π²ΡˆΠΈΠΌΡΡ ΠΎΠΊΠ½Π΅ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ New Project.

Рис. 2

Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ имя ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Create.

Рис. 3

НапишСм ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ тСст, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°.

Рис. 4. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Π² Ρ„Π°ΠΉΠ»Π΅ main.py

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рСсурса для тСстирования возьмСм популярный сайт для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ тСстирования: https://www.saucedemo.com.

КСйс:

  • Π—Π°ΠΉΡ‚ΠΈ Π½Π° страницу.
  • Найти элСмСнт ΠΏΠΎ id.
  • ВывСсти Π² консоль сообщСниС с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ поиска.
main.py
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(options=options, executable_path=r'C:/Users/.../.../chromedriver.exe')
driver.get("https://www.saucedemo.com/")
input_username = driver.find_element_by_id("user-name")
if input_username is None:
   print("Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½")
else:
   print("Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½")

ПослС Π²Π²ΠΎΠ΄Π° ΠΊΠΎΠ΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Selenium Π² наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

Для этого Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π½Π° подсвСчСнный тСкст Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅, Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Alt + Enter ΠΈ Π΄Π°Π»Π΅Π΅ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Install package selenium. Π­Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ нСустановлСнного ΠΏΠ°ΠΊΠ΅Ρ‚Π°.

Рис. 5. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ установки ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сцСнарий ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎ встроСнном эмуляторС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° IDE ΠΈΠ»ΠΈ Π² любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ:

python main.py
Рис. 6. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ запуска скрипта ΠΈΠ· IDE

Если всС установлСно ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚ страницу. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ запуска нашСго сцСнария Π½Π° Python, Π±ΡƒΠ΄Π΅Ρ‚ сообщСниС: β€œΠ­Π»Π΅ΠΌΠ΅Π½Ρ‚ найдСн”.

Рис. 7. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния скрипта.

3. Поиск элСмСнтов

Π’ нашСм скриптС присутствуСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка:

input_username = driver.find_element_by_id("user-name")
ΠœΠ΅Ρ‚ΠΎΠ΄ find_element_by_id позволяСт процСссу Π½Π°ΠΉΡ‚ΠΈ элСмСнт Π² Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠ΅ HTML ΠΏΠΎ наимСнованию Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° id. Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° Π΅ΡΡ‚ΡŒ нСсколько способов поиска элСмСнтов Π½Π° страницС: ΠΏΠΎ name, xpath, css, id. Поиск ΠΏΠΎ css ΠΈ xpath ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Π½ΠΎ ΠΎΠ½ слоТнСС для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…. ИспользованиС поиска ΠΏΠΎ name ΠΈ id Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅, Π½ΠΎ Π² практичСской Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π΅Π΄ΠΊΠΎ. Π”Π°Π»Π΅Π΅ я Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ xpath.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ напишСм кСйс Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° страницС Π²Ρ…ΠΎΠ΄Π°:

  • Π¨Π°Π³ 1: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ username ΠΈ password.
  • Π¨Π°Π³ 2: Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π²Π²ΠΎΠ΄Π°.
  • ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π° Π³Π»Π°Π²Π½ΡƒΡŽ страницу ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π½Π° соотвСтствиС β€œPRODUCTS”.
main.py
import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


def first_test():
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-logging"])
    driver = webdriver.Chrome(options=options, executable_path=r'C:/Users/.../.../chromedriver.exe')
    driver.get("https://www.saucedemo.com/")

    # Поиск элСмСнтов ΠΈ присваиваниС ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ.
    input_username = driver.find_element_by_xpath("//*[@id=\"user-name\"]")
    input_password = driver.find_element_by_xpath("//*[@id=\"password\"]")
    login_button = driver.find_element_by_xpath("//*[@id=\"login-button\"]")

    # ДСйствия с Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ
    input_username.send_keys("standard_user")
    input_password.send_keys("secret_sauce")
    login_button.send_keys(Keys.RETURN)

    # Поиск ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° попадания Π½Π° Π³Π»Π°Π²Π½ΡƒΡŽ страницу
    title_text = driver.find_element_by_xpath("//*[@id=\"header_container\"]/div[2]/span")
    if title_text.text == "PRODUCTS":
        print("ΠœΡ‹ ΠΏΠΎΠΏΠ°Π»ΠΈ Π½Π° Π³Π»Π°Π²Π½ΡƒΡŽ страницу")
    else:
        print("Ошибка поиска элСмСнта")

    time.sleep(5)


if __name__ == '__main__':
    first_test()

Π Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ пошагово:

  • Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„ΠΎΡ€ΠΌΠΎΠΉ Π½Π°ΠΉΠ΄Π΅ΠΌ ΠΈ присвоим элСмСнты ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ input_username, input_password ΠΈ login_button с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ xpath.
  • Π”Π°Π»Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ для элСмСнта ΠΌΠ΅Ρ‚ΠΎΠ΄ send_keys с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² тСкстовоС ΠΏΠΎΠ»Π΅. Π’ нашСм случаС Π² username отправляСм "standart_user", Π² password – "secret_sauce". ΠŸΡ€ΠΎΠ΅Ρ†ΠΈΡ€ΡƒΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Enter для Π²Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ send_keys для Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ с ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Keys.RETURN. Π­Ρ‚ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с дСйствиями ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π² Selenium, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ Π½Π° Enter Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅.
  • На Π³Π»Π°Π²Π½ΠΎΠΌ экранС Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΈ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ элСмСнт тСкста Products. Как я Π³ΠΎΠ²ΠΎΡ€ΠΈΠ» Ρ€Π°Π½Π½Π΅Π΅, Π½Π΅ всСгда Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΠΉΡ‚ΠΈ элСмСнт ΠΏΠΎ id – здСсь ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚ΠΎΡ‚ случай.
title_text = driver.find_element_by_xpath("//*[@id=\"header_container\"]/div[2]/span")
  • ΠŸΡƒΡ‚ΡŒ xpath Π΄ΠΎ элСмСнта: //*[@id=\"header_container\"]/div[2]/span.
  • Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡƒΡ‚ΡŒ xpath, Π·Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° https://www.saucedemo.com ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ F12, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ инструмСнты Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ стрСлку-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈ ΠΊΠ»ΠΈΠΊΠ½ΠΈΡ‚Π΅ ΠΏΠΎ элСмСнту Π΄ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡƒΡ‚ΡŒ. Π’ нашСм случаС Π΄ΠΎ Products.
Рис 8. Поиск xpath элСмСнта Π² инструмСнтах Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°
  • ΠžΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚ΡΡ ΠΊΠΎΠ΄ элСмСнта Π² Π΄Π΅Ρ€Π΅Π²Π΅ HTML, Π΄Π°Π»Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ контСкстноС мСню Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ строки ΠΈ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ xpath.
Рис 9. ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ xpath
Если ΠΊΡ€Π°Ρ‚ΠΊΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ, Ρ‚ΠΎ //* ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ всС элСмСнты Π½Π° страницС, Π° [@id=\"header_container\"] ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ условиС поиска (Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ всС элСмСнты Π½Π° страницС с тэгом id = "header_container").И Π΄Π°Π»Π΅Π΅ /div[2]/span – спускаСмся Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ элСмСнт div ΠΈ Π΄Π°Π»Π΅Π΅ Π½Π° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ элСмСнт span. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ xpath с Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ элСмСнта Π² инструмСнтах Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° – сразу станСт понятно Ρ‡Ρ‚ΠΎ ΠΊ Ρ‡Π΅ΠΌΡƒ.
  • Π’ΡƒΡ‚ ΠΌΡ‹ просто сравниваСм тСкст Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ элСмСнта с ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π² консоль сообщСниС.
main.py
if title_text.text == "PRODUCTS":
    print("ΠœΡ‹ ΠΏΠΎΠΏΠ°Π»ΠΈ Π½Π° Π³Π»Π°Π²Π½ΡƒΡŽ страницу")
else:
    print("Ошибка поиска элСмСнта")

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ скрипта ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Рис 10. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния скрипта

4. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ тСст с поиском ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ ΠΏΠΎ страницС

КСйс:

  • Π’Π²Π΅Π΄Π΅ΠΌ Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π·Π°ΠΉΠ΄Π΅ΠΌ Π½Π° Π³Π»Π°Π²Π½ΡƒΡŽ страницу.
  • НайдСм ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ "Sauce Labs Fleece Jacket".
  • ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° страницу Ρ‚ΠΎΠ²Π°Ρ€Π° ΠΈ Π½Π°ΠΆΠΌΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ добавлСния Π² ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ.
  • ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π² ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ присутствуСт 1 позиция с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ "Sauce Labs Fleece Jacket".
main.py
import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


def first_test():
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-logging"])
    driver = webdriver.Chrome(options=options, executable_path=r'C:/Users/…/…/chromedriver.exe')
    driver.get("https://www.saucedemo.com/")

    # Поиск элСмСнтов ΠΈ присваиваниС ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ.
    input_username = driver.find_element_by_xpath("//*[@id=\"user-name\"]")
    input_password = driver.find_element_by_xpath("//*[@id=\"password\"]")
    login_button = driver.find_element_by_xpath("//*[@id=\"login-button\"]")

    # ДСйствия с Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ
    input_username.send_keys("standard_user")
    input_password.send_keys("secret_sauce")
    login_button.send_keys(Keys.RETURN)

    # Поиск ссылки элСмСнта ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° ΠΈ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ ссылкС
    item_name = driver.find_element_by_xpath("//*[@id=\"item_5_title_link\"]/div")
    item_name.click()

    # Поиск ΠΊΠ½ΠΎΠΏΠΊΠΈ добавлСния Ρ‚ΠΎΠ²Π°Ρ€Π° ΠΈ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ этой ΠΊΠ½ΠΎΠΏΠΊΠ΅
    item_add_button = driver.find_element_by_xpath("//*[@id=\"add-to-cart-sauce-labs-fleece-jacket\"]")
    item_add_button.click()

    # Поиск ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΊΠΎΡ€ΠΈΠ·ΠΈΠ½Ρ‹ ΠΈ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ этой ΠΊΠ½ΠΎΠΏΠΊΠ΅
    shopping_cart = driver.find_element_by_xpath("//*[@id=\"shopping_cart_container\"]/a")
    shopping_cart.click()

    # Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ поиск ссылки элСмСнта ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°
    item_name = driver.find_element_by_xpath("//*[@id=\"item_5_title_link\"]/div")
    if item_name.text == "Sauce Labs Fleece Jacket":
        print("Π’ΠΎΠ²Π°Ρ€ пристутствуСт Π² ΠΊΠΎΡ€Π·ΠΈΠ½Π΅")
    else:
        print("Π’ΠΎΠ²Π°Ρ€ отсутствуСт")

    time.sleep(5)


if __name__ == '__main__':
    first_test()

Из Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΡƒΡ‚ добавился Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ click(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ просто ΠΊΠ»ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΌΡƒ элСмСнту.

ПослС прохоТдСния всСх шагов Π² консоль выводится Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΡ€Π·ΠΈΠ½Π΅ имССтся Ρ‚ΠΎΠ²Π°Ρ€.

ОТидания Π² selenium: Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ?

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

Selenium driver ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π° Π²ΠΈΠ΄Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ: явноС (explicit) ΠΈ нСявноС (implicity). Для явных ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ врСмя выполнСния тСста: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ минимальноС врСмя оТидания ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ элСмСнт, Ссли ΠΎΠ½ прогрузился Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ явного оТидания:

element = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable(
        (By.XPATH, '//*[@id=\"page_wrapper\"]/footer/ul/li[2]/a')
    )
)

ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΆΠ΄Π΅Ρ‚ 10 сСкунд ΠΏΠΎΠΊΠ° элСмСнт станСт доступным, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎ Π½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΊΠ»ΠΈΠΊΠ½ΡƒΡ‚ΡŒ. Если элСмСнт Ρ‚Π°ΠΊ ΠΈ Π½Π΅ прогрузился ΠΈ нСдоступСн для ΠΊΠ»ΠΈΠΊΠ°, гСнСрируСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ TimeoutException.

НСявныС оТидания Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°, Π° Π½Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта. Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ нСявноС ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° Selenium Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ элСмСнт: ΠΎΠ½ ΠΆΠ΄Π΅Ρ‚ установлСнноС врСмя ΠΈ Ссли Π½Π΅ доТдСтся, Ρ‚ΠΎΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TimeoutException. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΈ ΠΎΡ‚ явного оТидания, этот Ρ‚ΠΈΠΏ ΠΌΠ΅Π½Π΅Π΅ Π³ΠΈΠ±ΠΎΠΊ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ»ΠΎΡ…ΠΎΠ΅ влияниС Π½Π° ΠΎΠ±Ρ‰Π΅Π΅ врСмя ΠΏΡ€ΠΎΠ³ΠΎΠ½Π° тСстов.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ нСявного оТидания:

driver.implicitly_wait(10)

ΠžΠΆΠΈΠ΄Π°Ρ‚ΡŒ дСйствия ΠΌΠΎΠΆΠ½ΠΎ ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ time.sleep(5). Π£ нас Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π΅ΡΡ‚ΡŒ использованиС этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π½ΠΎ ΠΎΠ½ΠΎ считаСтся ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ примСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π΄Π΅Π±Π°Π³Π°.

5. Π Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ тСста, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ

Π§Ρ‚ΠΎΠ±Ρ‹ pytest понял, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ тСстовая, Π° Π½Π΅ обычная функция, сама тСстовая функция Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с test_.

Обновим наш тСст, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ оТидания для ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ тСстовых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π’Π°ΠΊΠΆΠ΅ я вынСс ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎΠ΄ оТидания, ΠΊΡƒΠ΄Π° ΠΌΡ‹ просто ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ xpath ΠΈ driver Π² Π²ΠΈΠ΄Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

main.py
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


# Ѐункция оТидания элСмСнтов
def wait_of_element_located(xpath, driver):
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located(
            (By.XPATH, xpath)
        )
    )
    return element


def test_add_jacket_to_the_shopcart():
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(options=options, executable_path=r'C:/Users/…/…/chromedriver.exe')
    driver.get("https://www.saucedemo.com/")

    # Поиск ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ элСмСнтов ΠΈ присваиваниС ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ.
    input_username = wait_of_element_located(xpath='//*[@id=\"user-name\"]', driver=driver)
    input_password = wait_of_element_located(xpath='//*[@id=\"password\"]', driver=driver)
    login_button = wait_of_element_located(xpath='//*[@id=\"login-button\"]', driver=driver)

    # ДСйствия с Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ
    input_username.send_keys("standard_user")
    input_password.send_keys("secret_sauce")
    login_button.send_keys(Keys.RETURN)

    # Поиск ΠΈ ΠΎΠΆΠ΄ΠΈΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€ΡƒΠ·ΠΊΠΈ ссылки элСмСнта Ρ‚ΠΎΠ²Π°Ρ€Π° ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° ΠΈ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ ссылкС
    item_name = wait_of_element_located(xpath='//*[@id=\"item_5_title_link\"]/div', driver=driver)
    item_name.click()

    # Поиск ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ добавлСния Ρ‚ΠΎΠ²Π°Ρ€Π° ΠΈ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ этой ΠΊΠ½ΠΎΠΏΠΊΠ΅
    item_add_button = wait_of_element_located(xpath='//*[@id=\"add-to-cart-sauce-labs-fleece-jacket\"]', driver=driver)
    item_add_button.click()

    # Π–Π΄Π΅ΠΌ ΠΏΠΎΠΊΠ° Ρ‚ΠΎΠ²Π°Ρ€ добавится Π² ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ, появится span(ΠΊΠΎΠ»-Π²ΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π² ΠΊΠΎΡ€Π·ΠΈΠ½Π΅) ΠΈ ΠΊΠ»ΠΈΠΊΠ°Π΅ΠΌ ΠΏΠΎ ΠΊΠΎΡ€Π·ΠΈΠ½Π΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ
    wait_of_element_located(xpath='//*[@id=\"shopping_cart_container\"]/a/span', driver=driver).click()

    # Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ поиск ссылки элСмСнта ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°
    item_name = wait_of_element_located(xpath='//*[@id=\"item_5_title_link\"]/div', driver=driver)
    if item_name.text == "Sauce Labs Fleece Jacket":
        print("Π’ΠΎΠ²Π°Ρ€ пристутствуСт Π² ΠΊΠΎΡ€Π·ΠΈΠ½Π΅")
    else:
        print("Π’ΠΎΠ²Π°Ρ€ отсутствуСт")

    time.sleep(5)


if __name__ == '__main__':
    test_add_jacket_to_the_shopcart()

Для запуска тСста с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pytest Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ pytest main.py. ПослС прохоТдСния всСх этапов Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ прохоТдСния.

6. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ

ΠœΡ‹ ΠΏΠ»Π°Π²Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ ΠΊ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ этапу написания тСста – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠΎ извСстному ΠΎΡ‚Π²Π΅Ρ‚Ρƒ. Π₯отя тСст выполняСтся ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΎΠ½ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ провСряСт ΠΈ являСтся бСссмыслСнным. Π‘ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартныС инструкции assert ΠΈΠ»ΠΈ утвСрТдСния. Π‘ΡƒΡ‚ΡŒ инструмСнта – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ соотвСтствуСт наши оТиданиям. Если соотвСтствуСт, наш тСст Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½Ρ‹ΠΌ, Π° Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС – ΠΏΡ€ΠΎΠ²Π°Π»Π΅Π½Π½Ρ‹ΠΌ.

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π² тСст ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. Π‘ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΡƒΡ€Ρ‚ΠΊΠΈ "Sauce Labs Fleece Jacket" ΠΈ описаниС ΠΊΠ°ΠΊ Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅.

main.py
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


# Ѐункция оТидания элСмСнтов
def wait_of_element_located(xpath, driver):
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located(
            (By.XPATH, xpath)
        )
    )
    return element


def test_add_jacket_to_the_shopcart():
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-logging"])
    driver = webdriver.Chrome(options=options, executable_path=r'C:/Users/…/…/chromedriver.exe')
    driver.get("https://www.saucedemo.com/")

    # Поиск ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ элСмСнтов ΠΈ присваиваниС ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ.
    input_username = wait_of_element_located(xpath='//*[@id=\"user-name\"]', driver=driver)
    input_password = wait_of_element_located(xpath='//*[@id=\"password\"]', driver=driver)
    login_button = wait_of_element_located(xpath='//*[@id=\"login-button\"]', driver=driver)

    # ДСйствия с Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ
    input_username.send_keys("standard_user")
    input_password.send_keys("secret_sauce")
    login_button.send_keys(Keys.RETURN)

    # Поиск ΠΈ ΠΎΠΆΠ΄ΠΈΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€ΡƒΠ·ΠΊΠΈ ссылки элСмСнта Ρ‚ΠΎΠ²Π°Ρ€Π° ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° ΠΈ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ ссылкС
    item_name = wait_of_element_located(xpath='//*[@id=\"item_5_title_link\"]/div', driver=driver)
    item_name.click()

    # Поиск ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ добавлСния Ρ‚ΠΎΠ²Π°Ρ€Π° ΠΈ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ этой ΠΊΠ½ΠΎΠΏΠΊΠ΅
    item_add_button = wait_of_element_located(xpath='//*[@id=\"add-to-cart-sauce-labs-fleece-jacket\"]', driver=driver)
    item_add_button.click()

    # Π–Π΄Π΅ΠΌ ΠΏΠΎΠΊΠ° Ρ‚ΠΎΠ²Π°Ρ€ добавится Π² ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ, появится span(ΠΊΠΎΠ»-Π²ΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π² ΠΊΠΎΡ€Π·ΠΈΠ½Π΅) ΠΈ ΠΊΠ»ΠΈΠΊΠ°Π΅ΠΌ ΠΏΠΎ ΠΊΠΎΡ€Π·ΠΈΠ½Π΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ
    wait_of_element_located(xpath='//*[@id=\"shopping_cart_container\"]/a/span', driver=driver).click()

    # Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ поиск ссылки элСмСнта ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°
    item_name = wait_of_element_located(xpath='//*[@id=\"item_5_title_link\"]/div', driver=driver)

    item_description = wait_of_element_located(
        xpath='//*[@id=\"cart_contents_container\"]/div/div[1]/div[3]/div[2]/div[1]',
        driver=driver
    )

    assert item_name.text == "Sauce Labs Fleece Jacket"
    assert item_description.text == "It's not every day that you come across a midweight quarter-zip fleece jacket capable of handling everything from a relaxing day outdoors to a busy day at the office."

    driver.close()


if __name__ == '__main__':
    test_add_jacket_to_the_shopcart()

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ расхоТдСнии Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ условия Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π° ошибка прохоТдСния. Π£ΠΊΠ°ΠΆΠ΅ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΡƒΡ€Ρ‚ΠΊΠΈ "Sauce Labs Fleece Jacket1". Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния скрипта Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

Рис 11. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния тСста.

7. РаспрСдСлим Π»ΠΎΠ³ΠΈΠΊΡƒ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΡ‡Π΅ΡˆΠ΅ΠΌ ΠΊΠΎΠ΄, распрСдСлив Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΏΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π±Ρ‹Π»ΠΎ с wait_of_element_located. Π Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для написания мноТСства тСстов.

main.py
import pytest
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


# Ѐункция оТидания элСмСнтов
def wait_of_element_located(xpath, driver_init):
    element = WebDriverWait(driver_init, 10).until(
        EC.presence_of_element_located(
            (By.XPATH, xpath)
        )
    )
    return element


# ВынСсСм ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Ρ†ΠΈΡŽ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ фикстуру pytest
@pytest.fixture
def driver_init():
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-logging"])
    driver = webdriver.Chrome(options=options, executable_path=r'C:/Users/…/…/chromedriver.exe')
    driver.get("https://www.saucedemo.com/")
    yield driver
    driver.close()


# ВынСсСм Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΡŽΠ·Π΅Ρ€Π° Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
def auth_user(user_name, password, driver_init):
    # Поиск ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ элСмСнтов ΠΈ присваиваниС ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ.
    input_username = wait_of_element_located(xpath='//*[@id=\"user-name\"]', driver_init=driver_init)
    input_password = wait_of_element_located(xpath='//*[@id=\"password\"]', driver_init=driver_init)
    login_button = wait_of_element_located(xpath='//*[@id=\"login-button\"]', driver_init=driver_init)

    # ДСйствия с Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ
    input_username.send_keys(user_name)
    input_password.send_keys(password)
    login_button.send_keys(Keys.RETURN)



def add_item_to_cart(xpath_item, driver_init):
    # Поиск ΠΈ ΠΎΠΆΠ΄ΠΈΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€ΡƒΠ·ΠΊΠΈ ссылки элСмСнта Ρ‚ΠΎΠ²Π°Ρ€Π° ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° ΠΈ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ ссылкС
    item_name = wait_of_element_located(
        xpath=xpath_item,
        driver_init=driver_init)
    item_name.click()

    # Поиск ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ добавлСния Ρ‚ΠΎΠ²Π°Ρ€Π° ΠΈ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ этой ΠΊΠ½ΠΎΠΏΠΊΠ΅
    item_add_button = wait_of_element_located(
        xpath='//*[@id=\"add-to-cart-sauce-labs-fleece-jacket\"]',
        driver_init=driver_init)
    item_add_button.click()

    # Π–Π΄Π΅ΠΌ ΠΏΠΎΠΊΠ° Ρ‚ΠΎΠ²Π°Ρ€ добавится Π² ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ, появится span(ΠΊΠΎΠ»-Π²ΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π² ΠΊΠΎΡ€Π·ΠΈΠ½Π΅)
    # Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ True ΠΈΠ»ΠΈ False Π² зависимости добавлися Ρ‚ΠΎΠ²Π°Ρ€ ΠΈΠ»ΠΈ Π½Π΅Ρ‚
    shop_cart_with_item = wait_of_element_located(
        xpath='//*[@id=\"shopping_cart_container\"]/a/span',
        driver_init=driver_init)
    return shop_cart_with_item


def test_add_jacket_to_the_shopcart(driver_init):
    # АутСнтификация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
    auth_user("standard_user", "secret_sauce", driver_init=driver_init)

    # Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ²Π°Ρ€Π° Π² ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ ΠΈ Ссли Ρ‚ΠΎΠ²Π°Ρ€ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ
    add_item_to_cart(xpath_item='//*[@id=\"item_5_title_link\"]/div',
                     driver_init=driver_init).click()
    # Поиск ΠΊΠΎΡ€Π·ΠΈΠ½Ρ‹ ΠΈ ΠΊΠ»ΠΈΠΊ
    wait_of_element_located(xpath='//*[@id=\"shopping_cart_container\"]/a',
                            driver_init=driver_init).click()

    # Поиск ссылки элСмСнта ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°
    item_name = wait_of_element_located(xpath='//*[@id=\"item_5_title_link\"]/div',
                                        driver_init=driver_init)

    # Поиск описания Ρ‚ΠΎΠ²Π°Ρ€Π°
    item_description = wait_of_element_located(xpath='//*[@id=\"cart_contents_container\"]/div/div[1]/div[3]/div[2]/div[1]',
                                               driver_init=driver_init)

    assert item_name.text == "Sauce Labs Fleece Jacket"
    assert item_description.text == "It's not every day that you come across a midweight quarter-zip fleece jacket" \
                                    " capable of handling everything from a relaxing day outdoors to a busy day at " \
                                    "the office."


if __name__ == '__main__':
    test_add_jacket_to_the_shopcart(driver_init=driver_init)
Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π»ΠΎΠ³ΠΈΠΊΠ° подСлилась Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ (фикстуры). Π’Π΅ΠΏΠ΅Ρ€ΡŒ аутСнтификация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ дСйствия ΠΈ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ тСстС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° использования фикстур сдСлана инициализация Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инстанс Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° Π²ΠΎ всСх тСстах, Π½Π΅ пСрСсоздавая Π΅Π³ΠΎ. Π›ΠΎΠ³ΠΈΠΊΠ° добавлСния Ρ‚ΠΎΠ²Π°Ρ€Π° Π² ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ Ρ‚ΠΎΠΆΠ΅ Π±Ρ‹Π»Π° вынСсСна Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для дальнСйшСго использования.

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

ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ дальшС ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΊΠΎΠ΄Π°.

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΏΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅

  • ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ всС Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ тСсты Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ. ПослС добавлСния Π΅Ρ‰Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… тСстов Π΄Π°ΠΆΠ΅ с распрСдСлСнной Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ скрипт Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΠΏΠΎΠ»ΠΎΡ‚Π½ΠΎ с Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Ссли Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ тСсты с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ, Π±Π΅Π· ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² Π² ΠΊΠΎΠ΄Π΅ Π½Π΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ. Для Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ: Π² ΠΎΠ΄Π½ΠΎΠΌ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ„Π°ΠΉΠ»Ρ‹ с тСстами, Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ частичная Π»ΠΎΠ³ΠΈΠΊΠ°, Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ – рСсурсы, Π² Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΌ – ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΈ Ρ‚.Π΄.
  • Π”Π°Π»Π΅Π΅ слСдуСт ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ автотСстов с использованиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования. Π­Ρ‚ΠΎ сэкономит массу Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π² написании слоТного ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.
  • Π‘Ρ‚ΠΎΠΈΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ проСктирования, особСнно Π½Π° PageObject ΠΈ PageFactoroy. Π’ эффСктивном тСстировании UI ΠΎΠ½ΠΈ ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ€ΠΎΠ»ΡŒ.
  • ВсС тСстовыС Π΄Π°Π½Π½Ρ‹Π΅ Π»ΡƒΡ‡ΡˆΠ΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² нСизмСняСмых классах, константах ΠΈΠ»ΠΈ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… (json, csv).

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

На этом созданиС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ автотСста Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½ΠΎ. НСкоторыС ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ Π±Ρ‹Π»ΠΈ рассмотрСны повСрхностно, Ρ‡Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ‹Ρ‚Π»ΠΈΠ²Ρ‹ΠΌ ΡƒΠΌΠ°ΠΌ ΠΏΠΎΠ³Π»ΠΎΡ‚ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… источников. Π£Π΄Π°Ρ‡ΠΈ!

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

admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
28 июня 2018

3 самых Π²Π°ΠΆΠ½Ρ‹Ρ… сфСры примСнСния Python: возмоТности языка

БущСствуСт мноТСство областСй примСнСния Python, Π½ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ особСнно...
admin
13 фСвраля 2017

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Пошаговая инструкция для всСх, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒΒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python...