суббота, 5 июня 2021 г.

Самые полезные ФУНКЦИИ Пайтона

 1) 

PRINT - выводит на печать переменную, указанную в скобках

print(average) 



2) 

LEN - посчитать количество элементов в списке

students_grades = [12, 10, 11, 10,12]
number_st = len(students_grades)
print(number_st)
Рез-т
5


3) 
STR, INT, FLOAT
- задает переменной указанный тип данных
x = 4   #Integer
y = "5" #String
calculate = int(y) - x #Делаем Y числом (integer), чтобы возможно было посчитать
print(calculate)


4)
LIST - преобразует в список

students_grade = [12, 10, 9, 12, 11]
squar = (n**2 for n in students_grade) # Все элементы списка возводим во вторую степень
list_squar = list(squar) # Если не преобразовать результат в список
                            - то выдаст ошибку
print(list_squar)

Рез-т
[144, 100, 81, 144, 121]


5) 
TUPLE - Создает кортеж


6) 
DICT - Создает словарь

Вариант 1
my_list = [('name','Rudy'),('surname','Tey3oyj5o3'),('country','Montenegro')]
rudy_data = dict(my_list)
print(rudy_data)

Рез-т
{'name': 'Rudy', 'surname': 'Tey3oyj5o3', 'country': 'Montenegro'}


Вариант 2
rudy_data = dict(name='Rudy', surname='Tey3oyj5o3', country='Montenegro')
print(rudy_data)
Рез-т
{'name': 'Rudy', 'surname': 'Tey3oyj5o3', 'country': 'Montenegro'}


7)
SET - НАБОР

Выстраивает все элементы списка в определенном порядке, исключает повторяющиеся элементы

old_list = [2, 4, 59, 48, 3, 2]
new_list = set(old_list)
print(new_list)
Рез-т
{2, 3, 4, 48, 59}


КАК ОПРЕДЕЛИТЬ ТИП ПЕРЕМЕННОЙ? (How to determine a Python variable type?

 Для этого используем TYPE

v = '134398y'        #Переменная

result = type(v)    #Определяем тип переменной и присваиваем его переменной result

print(result)            #Выводим результат на экран

среда, 2 июня 2021 г.

Как посчитать количество одинаковых элементов на странице (с одинаковым локатором)

 Например, нужно проверить сколько товаров в корзине.

Предположим, ожидаемое количество товаров в корзине - 3. Для этого надо посчитать сколько контейнеров для товаров отображается на странице.  






Сам тест:

def test_user_should_see_three_books_in_cart(driver):
    ...
    assert cart_page.is_books_amount_correct(3), /
        "The user has incorrect number of books in the cart."



В cart_page.py:

class CardPage(BasePage):

def __init__(self, driver):
super(BasePage, self).__init__()
self.driver = driver
assert self.is_page_displayed()

def is_page_displayed(self):
element = HtmlElement(self.driver, self.element_locator)
return element.is_element_visible()

def is_books_amount_correct(self, expected_amount):
actual_amount = len(self.driver.find_elements_by_xpath(
'//div[contains(@class, "book-item") and not(contains(@class, "some-special-class"))]'))
return actual_amount == expected_amount


not(contains(@class, "some-special-class") 
Используем, если нужно исключить какой-то класс (например, книги для взрослых)

четверг, 6 мая 2021 г.

Создаем новый проэкт с нуля (Python-Selenium)

 1. Создаем новый проэкт в PyCharm

File - New Project


2. Установите версию Python, которую хотите использовать. Скачать можно тут

https://www.python.org/downloads/


3. Надите свой Python в Applications (if you use Mac) - Кликните Install.Certificates.command


4. Создаем виртуальный энваирмент 

в Терминале пишем (для создания)

python3.9 -m venv new_venv


в Терминале (для активации)

source /your_path/new_venv/bin/activate


5. Указываем нужную нам версию Python

cd '' && '/usr/local/bin/python3'


2.  

Добавляем requirements.txt файл в проэкт



Чтобы запустить существущий проект вводим в терминале

pip install -r /Users/anna/Documents/WORK/project/requirements.txt


Устанавливаются все указанные в requirement.txt библиотеки

3. Теперь добавим эти файлы 

PyCharm - Preferences  
смотрите шаги тут - СТАТЬЯ

После установки нужных файлов Requirements файл будет уже выглядеть так



4. Добавляем папку webdrivers - туда скачиваем необходимый нам драйвер - я использую chromedriver

Где взять драйвер читайте ТУТ - СТАТЬЯ.



5. Создаем папку tests и в ней файл __init__.py

В эту папку мы будем складывать наши файлы с тестами.

6. Создаем файл в корне проекта (обычный, не Python файл) .gitignore








7. PyCharm - Preferences - Tools - Python Integrated Tools 

Default test runner - pytest

Чтобы связать PyCharm - SourceTree - BitBucket 


1) PyCharm - создаем проект

2) SourceTree - Добавляем свой проект как ЛОКАЛЬНЫЙ РЕПОЗИТОРИЙ в SourceTree

File - New - Add Existing Local Repository


3) Чтобы теперь открыть этот проект через SourceTree

File - Open - Выбираем тот проект, который только что добавили


Теперь, чтобы переключаться между проектоми - надо открывать нужный вам. Если открыты оба - то только выбираете нужное вам окошко с проектом.



Добавляем путь в Bitbucket


1) Создаем репозиторий в Bitbucket - master (тут продакшн)

2) На его основании создаем репозиторй develop (тут файлы для стейджинга)

Branches - Create Branch - develop



3) Создаем репозиторий  в SourceTree

4) Settings - Remotes - Add


5) Нажимаем Add

Чтобы получить ссылку заходим в Bitbucket - выбираем нужный репозиторий и копируем ссылку на него








___________

Для тестирования с помощью BrowserStack потребуются Бинарии (Binaries)

https://www.browserstack.com/local-testing/automate









понедельник, 8 марта 2021 г.

Jenkins API - получить доступ к файлам на Jenkins

Чтобы получить инфу по опеределенной джобе: 

http://<JENKINS_HOST>/job/<JOB_NAME>/api/json?pretty=true


Чтобы получить информацию по определенной сборке:

http://<JENKINS_HOST>/job/<JOB_NAME>/<BUILD_NUMBER>/api/json?pretty=true



вторник, 16 февраля 2021 г.

Как посчитать количество открытых вкладок

 Например, мы нажимаем на кнопку и открывается новая вкладка (tab) в том же окне. 

Перед тем, как переключиться на эту новую вкладку, лучше всего проверить, сколько вкладок открыто в данный момент, и, если вкладок больше одной, переключиться тогда.

В случае, если вкладка после нажатия на кнопку не открылась, сообщение об ошибке (которое мы зададим), должно отобразиться.

Если пропустить эту проверку, то при неоткрытии вкладки, тест просто упадет с ошибкой "IndexError: list index out of range"


def switch_to_new_tab(driver):
number_of_tabs = len(driver.window_handles)
if number_of_tabs > 1:
driver.switch_to.window(driver.window_handles[1])
else:
print("The new tab is not opened.")

суббота, 16 января 2021 г.

Операции с LIST (Список)

 dir (list)


 |  list(iterable=(), /) - Имеет возможность прохода по всем элементам списка.

 |  

 |  Built-in mutable sequence. - Встроенный в Python тип данных - последовательность, которая может быть изменена.

 |  

 |  Methods defined here: (Методы, которые можно использовать со СПИСКОМ)

 |  

 |  __add__(self, value, /)

 |      Return self+value - Добавляет элемент или список элементов в конец существующего списка.

- Пример

list = [445, 1, 928, 435.3, 0, 3, 1]
new_list = list.__add__([222, 'def', 4444])
print(new_list)
- Результат
[445, 1, 928, 435.3, 0, 3, 1, 222, 'def', 4444]

 |  

 |  __contains__(self, key, /)

 |      Return key in self. - Если элемент (key) обнаружен в списке, то возвращает True, если нет - то False.

- Привет

list = [445, 1, 928, 435.3, 0, 3, 1]
if_contains_element = list.__contains__(1)
print(if_contains_element)
- Результат 
True

 |  

 |  __delitem__(self, key, /)

 |      Delete self[key]. - Удаляет элемент по указанному индексу (key)

- Пример

list = [445, 1, 928, 435.3, 0, 3, 1]
list.__delitem__(3)
print(list)
- Результат
[445, 1, 928, 0, 3, 1]

 |  

 |  __eq__(self, value, /)

 |      Return self==value - Проверяет список value является ли идентичным данному списку. Если списки одинаковы (одинаковым должен быть и порядок) - то возвращает значение True,  если списки не идентичны, то возвращает False.

- Пример 1

list = [445, 0, 928, 435.3, 1, 3, 1]
are_lists_equal = list.__eq__([445, 0, 928, 435.3, 1, 3, 1])
print(are_lists_equal)
- Результат
True
- Пример 2
list = [445, 0, 928, 435.3, 1, 3, 1]
are_lists_equal = list.__eq__([1])
print(are_lists_equal)
- Результат
False

 |  

 |  __ge__(self, value, /)

 |      Return self>=value.

 |  

 |  __getattribute__(self, name, /)

 |      Return getattr(self, name).

 |  

 |  __getitem__(...)

 |      x.__getitem__(y) <==> x[y]

 |  

 |  __gt__(self, value, /)

 |      Return self>value.

 |  

 |  __iadd__(self, value, /)

 |      Implement self+=value.

 |  

 |  __imul__(self, value, /)

 |      Implement self*=value.

 |  

 |  __init__(self, /, *args, **kwargs)

 |      Initialize self.  See help(type(self)) for accurate signature.

 |  

 |  __iter__(self, /)

 |      Implement iter(self).

 |  

 |  __le__(self, value, /)

 |      Return self<=value.


 |  

 |  __len__(self, /)

 |      Return len(self) - Возвращает количество элементов в списке

- Пример

list = [445, 0, 928, 435.3, 1, 3]
length = list.__len__()
print(length)
- Результат
6

 |  

 |  __lt__(self, value, /)

 |      Return self<value.


 |  

 |  __mul__(self, value, /)

 |      Return self*value. - Создает новый список, который включает в себя старый список столько раз, сколько указано в value - по сути умножает список на value

-  Пример

list = [445, 0, 928, 435.3, 1, 3]
new_list = list.__mul__(2)
print(new_list)
- Результат
[445, 0, 928, 435.3, 1, 3, 445, 0, 928, 435.3, 1, 3]

 |  

 |  __ne__(self, value, /)

 |      Return self!=value. - Возвращает True, если список value не равен данному списку, возвращает False - если списки одинаковые

- Пример 1

list = [445, 0, 928, 435.3, 1, 3]
new_list = list.__ne__([445, 0, 928, 435.3, 1, 3])
print(new_list)
- Результат
False

- Пример 2

list = [445, 0, 928, 435.3, 1, 3]
new_list = list.__ne__(["egwg", 1, 333])
print(new_list)
- Результат
True

 |  

 |  __repr__(self, /)

 |      Return repr(self).

 |  

 |  __reversed__(self, /)

 |      Return a reverse iterator over the list.

 |  

 |  __rmul__(self, value, /)

 |      Return value*self.

 |  

 |  __setitem__(self, key, value, /)

 |      Set self[key] to value. - Заменяет элемент с индексом key на значение value.

- Пример

list = [445, 0, 928, 435.3, 1, 3]
list.__setitem__(2, "frgj")
print(list)
-Результат
[445, 0, 'frgj', 435.3, 1, 3]


 |  

 |  __sizeof__(self, /)

 |      Return the size of the list in memory, in bytes - Возвращает размер списка с байтах.

- Пример

list = [445, 0, 928, 435.3, 1, 3]
size = list.__sizeof__()
print(size)
- Результат
88

 |  

 |  append(self, object, /)

 |      Append object to the end of the list (Добавляет новый элемент в конец списка). 

- Пример:

list = [1, 443, 928, 435.3]
list.append(13)
print(list)
- Результат:
[1, 443, 928, 435.3, 13]

 |  

 |  clear(self, /)

 |      Remove all items from list (Очищает список).

- Пример:

list = [1, 443, 928, 435.3]
list.clear()
print(list)
- Результат:
[] - пустой список

 |  

 |  copy(self, /)

 |      Return a shallow copy of the list.

 |  


 |  count(self, value, /)

 |      Return number of occurrences of value (Считает сколько раз определенный элемент встерчается в последовательности).

- Пример:

list = [1, 443, 928, 435.3, 1, 324, 4, 1]
number_occurancies = list.count(1)
print(number_occurancies)
- Результат:
3

 |  

 |  extend(self, iterable, /)

 |      Extend list by appending elements from the iterable (Добавляет в текущий список элементы из списка iterable.

- Пример:

list = [1, 443, 928, 435.3, 0]
list.extend([4, 22])
print(list)
- Результат:
[1, 443, 928, 435.3, 0, 4, 22]

 |  

 |  index(self, value, start=0, stop=9223372036854775807, /)

 |      Return first index of value. -  Ищет элемент value и выдает индекс первого найденного элемента.
Если в скобках указано только одно значение, то ищет это значение по всему списку.

 |      Raises ValueError if the value is not present. - Возвращает сообщение об ошибке, что элемент не найден.

- Пример:

ValueError: 42357 is not in list


- Пример 1:

list = [1, 443, 928, 435.3, 0, 3, 1, 0 , 46, 24]
first_index = list.index(1)
print(first_index)
- Результат:
0 - Так как элементы списка считаются с нуля (то есть первый элемент имеет индекс 0, второй - 1, третий - 2 и так далее).

Если в скобках указано 2 или 3 элемент: первый элемент (value) - это искомое значение, второй (start) - индекс с которого
 надо начать поиск, третий (stop) - последний элемент в поиске)
При этом начальный элемент (start) включается в поиск, а последний (stop) - нет.

- Пример 2:

list = [445, 1, 928, 435.3, 0, 3, 1, 0 , 46, 24]
first_index = list.index(1, 1, 7)
print(first_index)
- Результат:
1 - Единица имеет индекс 1 в списке, поиск с первого элемента (включительно) до седьмого элемента (не включительно).

 |  

 |  insert(self, index, object, /)

 |      Insert object before index. - Добавляет в список элемент object перед указанным индексом.

- Пример

list = [445, 1, 928, 435.3, 0, 3, 1, 0 , 46, 24]
list.insert(1, 4857)
print(list)
- Результат
[445, 4857, 1, 928, 435.3, 0, 3, 1, 0, 46, 24]

 |  

 |  pop(self, index=-1, /)

 |      Remove and return item at index (default last). - Удаляет элемент из списка по указанному индексу.

 |      Raises IndexError if list is empty or index is out of range. - Отображает ошибку, если список пустой или не содержит запрашиваемый индекс.

- Пример 2

list = [445, 1, 928, 435.3, 0, 3, 1, 0 , 46, 24]
list.pop(2)
print(list)
- Результат
[445, 1, 435.3, 0, 3, 1, 0, 46, 24]

Возвращает элемент по индексу. Но при этом элемент из списка удаляется
- Пример 2
list = [445, 1, 928, 435.3, 0, 3, 1, 0 , 46, 24]
element = list.pop(2)
print(element)
print(list)
- Результат
928
[445, 1, 435.3, 0, 3, 1, 0, 46, 24]

 |  

 |  remove(self, value, /)

 |      Remove first occurrence of value. - Удаляет первый элемент, который попадется в списке с указнным значением (value)

 |      Raises ValueError if the value is not present. - Выдает ошибку, если элемента нет в списке

- Пример

list = [445, 1, 928, 435.3, 0, 3, 1, 0 , 3, 46, 24]
list.remove(3)
print(list)
Результат
[445, 1, 928, 435.3, 0, 1, 0, 3, 46, 24]

 |  

 |  reverse(self, /)

 |      Reverse *IN PLACE*. - Переворачивает список - в итоге список начинается с последнего элемента и заканчивается первым.

- Пример

list = [445, 1, 928, 435.3, 0, 3, 1, 0 , 3, 46, 24]
list.reverse()
print(list)
- Результат
[24, 46, 3, 0, 1, 3, 0, 435.3, 928, 1, 445]

 |  

 |  sort(self, /, *, key=None, reverse=False)

 |      Stable sort *IN PLACE* - Сортирует список  - по умолчанию (если никакие дополнительные параметры не указаны) от меньшего элемента к большему (для числовых значений)

- Пример 1

list = [445, 1, 928, 435.3, 0, 3, 1, 0 , 3, 46, 24]
list.sort()
print(list)
- Результат
[0, 0, 1, 1, 3, 3, 24, 46, 435.3, 445, 928]

 |  

 |  ----------------------------------------------------------------------

 |  Static methods defined here:

 |  

 |  __new__(*args, **kwargs) from builtins.type

 |      Create and return a new object.  See help(type) for accurate signature.

 |  


среда, 6 января 2021 г.

Получить имя скачиваемого файла на Mac и Windows (если это имя не содержится в ссылке для скачивания)

 Код в файле теста:


@pytest.mark.skipif(pytest.mark._config.getoption('os') == 'win', 
                    reason='This test is for Mac only')
def test_correct_app_version_should_be_downloaded_on_mac(driver):
page.open(driver)
page.click_download_button(driver)
assert page.is_downloaded_app_version_correct(driver, TestData.app_for_mac_format), \
"Downloaded App has incorrect for Mac format"


@pytest.mark.skipif(pytest.mark._config.getoption('os') == 'mac', 
reason='This test is for Windows only')
def test_correct_app_version_should_be_downloaded_on_windows(driver_win_chrome):
page.open(driver_win_chrome)
page.click_download_button(driver_win_chrome)
assert page.is_downloaded_app_version_correct(
       driver_win_chrome, TestData.sa_app_for_win_format), \
"Downloaded App has incorrect for Windows format"


Код в Page:
@allure.step("Check if downloaded App version is correct.")
def is_downloaded_app_version_correct(driver, expected_format):
downloaded_file_name = _get_downloaded_filename(driver, 180)
print(downloaded_file_name)
return expected_format in downloaded_file_name

def _get_downloaded_filename(driver, waitTime):
driver.execute_script("window.open()")
driver.switch_to.window(driver.window_handles[-1])
driver.get('chrome://downloads')
endTime = time.time()+waitTime
while True:
try:
return driver.execute_script(
"return document.querySelector('downloads-manager').shadowRoot.querySelector"
"('#downloadsList downloads-item').shadowRoot.querySelector"
"('div#content #file-link').text")
except:
pass
time.sleep(1)
if time.time() > endTime:
break

среда, 30 декабря 2020 г.

Найти имя скачанного файла и проверить содержит ли оно определенный текст (Python/Selenium)

 Итак, задача такая: 

 - клиент кликает на Скачать кнопку,  начинается загрузка. Нужно найти скачиваемый файл в папке и проверить действительно ли это файл с расширением .dmg (для Mac).

Если название файла содержится в ссылке для скачивания, то решение этой задачи будет довольно простым. Но в нашей ситуации ссылка одна, при клике на нее, автоматически определяется Mac или Windows. Соответсвующий файл (.dmg для Mac, .exe для Windows) начинает скачиваться.


Код в файле теста:

def test_correct_app_should_be_downloaded_on_mac(driver):
page.open(driver)
assert page.is_downloaded_app_correct(driver, TestData.app_for_mac_format), \
"Downloaded App has incorrect for Mac format"

Код в файле Data:

TestData.sa_app_for_mac_format = ".dmg"

Код в файле Page:

def is_downloaded_app_correct(driver, expected_format):
before = os.listdir('/Users/anna/Downloads')
download_button = Button(driver, download_button_locator)
download_button.click()
max_wait = 30
current_wait = 0
while current_wait < max_wait:
after = os.listdir('/Users/anna/Downloads')
change = set(after) - set(before)
lenght = len(change)
if lenght == 1:
file_name = str(change.copy())
print(file_name)
if file_name.index(expected_format):
return True
else:
current_wait += 1
time.sleep(1)
print("The download has not started within " + str(max_wait) + "seconds.")
return False

Такой вариант подоедет для локальной проверки на компьютере или если вы можете точно определить путь, где сохраняется скачиваемый 
файл. Если же для прогонки автотестов используется BrowserStack - то с опрелением папки возникнут проблемы (BrowserStack 
не даст вам такой информации).
В таком случае код надо будет написать по-другому. Об этом моя следующая статья.
Как получить имя скачиваемого файла при использовании BrowserStack - СТАТЬЯ.


Как найти путь, куда сохраняется файл на Mac, читайте ТУТ.


Как посмотреть путь к файлу на Mac.

 Чтобы посмотреть какой именно путь имеет файл на Маке (какие именно папки):


1. Открываем Finder на компе.

2. Выбираем интересующий нас файл.

3. Option + Command + R (нажимаем эти клавиши одновременно на клавиатуре).

4. Теперь внизу окна можем посмотреть путь к файлу (смотрите на фото).




Самые полезные ФУНКЦИИ Пайтона

 1)  PRINT - выводит на печать переменную, указанную в скобках print (average)   2)  LEN - посчитать количество элементов в списке student...