Skip to content

rain-philosophy/rain.autotest

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

12 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

rain.autotest

Stepik's autotest course hw by Rain


about chrome driver:

ChromeDriver is a powerful tool, and it can cause harms in the wrong hands. While using ChromeDriver, please follow these suggestions to help keeping it safe:

By default, ChromeDriver only allows local connections. If you need to connect to it from a remote host, use --allowed-ips switch on the command line to specify a list of IP addresses that are allowed to connect to ChromeDriver.

If possible, run ChromeDriver with a test account that has no access to sensitive local or network data. ChromeDriver should never be run with a privileged account.

If possible, run ChromeDriver in a protected environment such as Docker or virtual machine.

Use firewall to prevent unauthorized remote connection to ChromeDriver.

If you are using ChromeDriver through third-party tools such as Selenium Server, be sure to protect the network ports of those tools as well.

Use the latest versions of ChromeDriver and Chrome.


code features:
auto exit from chrome | try-except-finally
from selenium import webdriver
from selenium.webdriver.common.by import By

link = "http://suninjuly.github.io/simple_form_find_task.html"

try:
    browser = webdriver.Chrome()
    browser.get(link)
    button = browser.find_element(By.ID, "submit")
    button.click()
except Exception as error:
	print(f'--Error {error}')
finally:
    # Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ послС всСх манипуляций
    browser.quit()

# Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡƒΡΡ‚ΡƒΡŽ строку Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ„Π°ΠΉΠ»Π°, Ρ‚.ΠΊ. систСмы UNIX/Linux ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ ΠΏΡƒΡΡ‚ΡƒΡŽ строку Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ„Π°ΠΉΠ»Π°, 
# Ссли Π² вашСм скриптС Π΅Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Ρ‚ΠΎ послСдняя строчка, содСрТащая ΠΊΠΎΠ΄, ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ.
auto exit from chrome | with-as
from selenium import webdriver
from selenium.webdriver.common.by import By

link = "http://suninjuly.github.io/simple_form_find_task.html"

with webdriver.Chrome() as browser:
    browser.get(link)
    button = browser.find_element(By.ID, "submit")
    button.click()

# Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡƒΡΡ‚ΡƒΡŽ строку Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ„Π°ΠΉΠ»Π°, Ρ‚.ΠΊ. систСмы UNIX/Linux ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ ΠΏΡƒΡΡ‚ΡƒΡŽ строку Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ„Π°ΠΉΠ»Π°, 
# Ссли Π² вашСм скриптС Π΅Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Ρ‚ΠΎ послСдняя строчка, содСрТащая ΠΊΠΎΠ΄, ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ.
assert
# провСряСм, Ρ‡Ρ‚ΠΎ количСство Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² Ρ€Π°Π²Π½ΠΎ 2
assert len(goods) == 2, 'smth wrong'

message = browser.find_element_by_id("verify_message")
assert "successful" in message.text

assert "login" in browser.current_url, # сообщСниС ΠΎΠ± ошибкС

catalog_text = self.catalog_link.text # считываСм тСкст ΠΈ записываСм Π΅Π³ΠΎ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ,Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Ρ€Π°Ρ‚ΡŒ Π΄Π²Π° Ρ€Π°Π·Π°
assert catalog_text == "ΠšΠ°Ρ‚Π°Π»ΠΎΠ³", \
    f"Wrong language, got {catalog_text} instead of 'ΠšΠ°Ρ‚Π°Π»ΠΎΠ³'"  
get_atribute
# http://suninjuly.github.io/math.html
# <input class="check-input" type="radio" name="ruler" id="peopleRule" value="people" checked>

people_radio = browser.find_element_by_id("peopleRule")
people_checked = people_radio.get_attribute("checked")
print("value of people radio: ", people_checked)

assert people_checked is not None, "People radio is not selected by default"
# Π’.ΠΊ. Ρƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ явно, Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ get_attribute Π²Π΅Ρ€Π½Ρ‘Ρ‚ "true". Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, 
# Ρ‡Ρ‚ΠΎ "true" написано с малСнькой Π±ΡƒΠΊΠ²Ρ‹, β€” всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ WebDriver Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JavaScript, 
# Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ»Π΅Π²Ρ‹Π΅ значСния ΠΏΠΈΡˆΡƒΡ‚ΡΡ с малСнькой Π±ΡƒΠΊΠ²Ρ‹, Π° Π½Π΅ с большой, ΠΊΠ°ΠΊ Π² Python.

# ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ способом, сравнив строки:
assert people_checked == "true", "People radio is not selected by default"

robots_radio = browser.find_element_by_id("robotsRule")
robots_checked = robots_radio.get_attribute("checked")
assert robots_checked is None
# Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° disabled, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ 
# с элСмСнтом. 
select - Ρ€Π°Π±ΠΎΡ‚Π° со списками
from selenium.webdriver.support.ui import Select
select = Select(browser.find_element_by_tag_name("select"))
select.select_by_value("1") # ΠΈΡ‰Π΅ΠΌ элСмСнт с тСкстом "Python"
# МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: select.select_by_visible_text("text") ΠΈ select.select_by_index(index). 
execute_script - Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ JavaScript Ρ‡Π΅Ρ€Π΅Π· selenium
from selenium import webdriver
browser = webdriver.Chrome()
browser.execute_script("document.title='Script executing';alert('Robots at work');")
send file from directory
import os 

current_dir = os.path.abspath(os.path.dirname(__file__)) # ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ ΠΊ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π° 
file_path = os.path.join(current_dir, 'file.txt')        # добавляСм ΠΊ этому ΠΏΡƒΡ‚ΠΈ имя Ρ„Π°ΠΉΠ»Π° 
element.send_keys(file_path)
alert
# ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π°Π»Π΅Ρ€Ρ‚
alert = browser.switch_to.alert
alert.accept()

# Π²Π·ΡΡ‚ΡŒ тСкст Π°Π»Π΅Ρ€Ρ‚Π°
alert = browser.switch_to.alert
alert_text = alert.text

# ΠΊΠΎΠ½Ρ„ΠΈΡ€ΠΌ - сообщСниС с Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹
confirm = browser.switch_to.alert
confirm.accept()
confirm.dismiss()

# ΠΏΡ€ΠΎΠΌΡ‚ - сообщСниС с ΠΏΠΎΠ»Π΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚Π°
prompt = browser.switch_to.alert
prompt.send_keys("My answer")
prompt.accept()
windows
browser.switch_to.window(window_name)
new_window = browser.window_handles[1]
waits | implicit wait
# нСявноС ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ (Implicit wait) - Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ WebDriver ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 5 сСкунд
# Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ смоТСм ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ элСмСнт Π² идСальном случаС сразу, Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС Π·Π° 5 сСкунд.
browser = webdriver.Chrome()
browser.implicitly_wait(5)

Если ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ошибка, Ρ‚ΠΎ WebDriver выбросит ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (exceptions):

  • Если элСмСнт Π½Π΅ Π±Ρ‹Π» Π½Π°ΠΉΠ΄Π΅Π½ Π·Π° ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ врСмя, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ NoSuchElementException.
  • Если элСмСнт Π±Ρ‹Π» Π½Π°ΠΉΠ΄Π΅Π½ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ поиска, Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ элСмСнту DOM измСнился, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ StaleElementReferenceException. НапримСр, ΠΌΡ‹ нашли элСмСнт Кнопка ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ врСмя Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ с Π½ΠΈΠΌ ΡƒΠΆΠ΅ извСстный Π½Π°ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ click. Если ΠΊΠ½ΠΎΠΏΠΊΠ° Π·Π° это врСмя Π±Ρ‹Π»Π° скрыта скриптом, Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΡƒΠΆΠ΅ бСсполСзно β€” элСмСнт "устарСл" (stale) ΠΈ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.
  • Если элСмСнт Π±Ρ‹Π» Π½Π°ΠΉΠ΄Π΅Π½ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ поиска, Π½ΠΎ сам элСмСнт Π½Π΅Π²ΠΈΠ΄ΠΈΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹), ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ смог Π±Ρ‹ с Π½ΠΈΠΌ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ElementNotVisibleException.
waits | explicit wait
# явноС оТиданиС (Explicit Waits)
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver

browser = webdriver.Chrome()
browser.get("http://suninjuly.github.io/wait2.html")
# Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Selenium ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 5 сСкунд, ΠΏΠΎΠΊΠ° ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π΅ станСт кликабСльной
button = WebDriverWait(browser, 5).until(
        EC.element_to_be_clickable((By.ID, "verify"))
        )
button.click()
message = browser.find_element_by_id("verify_message")
assert "successful" in message.text

'''
Π’ ΠΌΠΎΠ΄ΡƒΠ»Π΅ expected_conditions Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ оТидания 
((By.ID, 'сСлСктор'),'Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅'))
title_is
title_contains
presence_of_element_located
visibility_of_element_located
visibility_of
presence_of_all_elements_located
text_to_be_present_in_element
text_to_be_present_in_element_value
frame_to_be_available_and_switch_to_it
invisibility_of_element_located
element_to_be_clickable
staleness_of
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
alert_is_present
'''

# Если ΠΌΡ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ° становится Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ послС ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ 
# ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° until_not: Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Selenium ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 5 сСкунд ΠΏΠΎΠΊΠ° ΠΊΠ½ΠΎΠΏΠΊΠ° станСт Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ
button = WebDriverWait(browser, 5).until_not(
        EC.element_to_be_clickable((By.ID, "verify"))
        )
pageLoadStrategy
# none (Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ)
# eager (страница становится ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ)
# normal (полная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° страницы)

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

link = "example.com"
caps = DesiredCapabilities.CHROME
browser = webdriver.Chrome(desired_capabilities=caps)
caps['pageLoadStrategy'] = 'none' # Do not wait for full page load
saving and adding packages via requirements.txt
$ pip freeze > requirements.txt

$ mkdir environments
$ cd environments
$ python3 -m venv selenium_env
$ source selenium_env/bin/activate
$ pip install -r requirements.txt

--help

Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ readme
... Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ пСрСмСнная PATH?
отучаСмся ΠΎΡ‚ токсичных code-review
youtube: if __name __ == 'main': Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚

css:

Ρ‚Ρ€Π΅Π½Π°ΠΆΠ΅Ρ€ ΠΏΠΎ css-сСлСкторам
css-сСлСкторы
css sselector reference
ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π° Ρ…Π°Π±Ρ€Π΅: Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ CSS ΠΈ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ тСстирования ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΡ
... ΠΊΠ°ΠΊ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ Π»ΠΎΠΊΠ°Ρ‚ΠΎΡ€Ρ‹?

selenium:

Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ html
пояснСниС за expected_conditions для explicit wait
... ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ страницы
... Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ "ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ страницы"?
How to Get Selenium to Wait for Page Load After a Click

git:

Ρ‚Ρ€Π΅Π½Π°ΠΆΠ΅Ρ€ ΠΏΠΎ git
ΠΊΠ½ΠΈΠ³Π° ΠΏΠΎ git
Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΊΠ½ΠΈΠ³Π° ΠΏΠΎ git
git для Π΄Π°ΡƒΠ½ΠΎΠ² Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΡ‚ΠΈΠΊΠΎΠ²
Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ‚Ρ€Π΅Π½Π°ΠΆΠ΅Ρ€ ΠΏΠΎ git

watchit:

Deep dive into Selenium Waits | Selenium camp
Serverless – Automated Tests of web apps in the Cloud world

About

Stepik's autotest course hw

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages