суббота, 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. Теперь внизу окна можем посмотреть путь к файлу (смотрите на фото).




суббота, 24 октября 2020 г.

Использование переменной в локаторе (XPATH).

Нужно проверить правильная ли цена отображается на сайте.

Переменная var будет разной в зависимости от продукта (или региона, например). 

Мы можем использовать данную функцию для поиска и проверки всех цен, меняется только  expected_price и var.


@allure.step("Check that price is correct")
def is_price_correct(driver, expected_price, var):
price_locator = (
By.XPATH,
'//div[@id="buySASub1"]//span[contains(@data-type, "upgrade")
         and contains(@data-tier, "'+var+'")]'
)
return is_element_price_correct(driver, expected_price, price_locator)

пятница, 23 октября 2020 г.

Как правильно переносить текст при использовании CSS-селекторов (CSS-Selector)

  def click_buy_button(driver):

    a_button_locator = (

        By.XPATH, 

        "//a[contains(@class, 'product-purchase') "

        "and contains(@href, '" + Config.ps_base_url + "')]"

    )

    a_button = Button(driver, a_button_locator)

    a_button.click()

Описание XPath с помощью Contains

 Contains примеры:


1) Класс

//a[contains(@class, 'product-formatted-price')



2) Текст


a[contains(text(),"Get")]



3) Ссылку


//a[contains(@class, 'product-purchase') and contains(@href, '" + Config.ps_base_url + "')]



4) ID


//div[contains(@id,"content")]



5) Другие (data-type...)


//span[contains(@data-type, 'no')]



6) Содержит сразу 2 условия


//span[contains(@data-type, 'no') and contains(@data-time, '0')]



7) Описать элемент, который находится внутри секции buySub1


//div[@id="buySub1"]//span[contains(@data-type, 'no') and contains(@data-tier, '0')]

четверг, 22 октября 2020 г.

Как обновить Allure, Pytest, Selenium и др. в PyCharm. Как использовать Pytest в PyCharm

Чтобы использовать Pytest для тестирования в PyCharm:

1. PyCharm - Preferences


2. Tools - Python Integrated Tools

3. В Default test runner выбираем Pytest



4. Apply - Сохраняем изменения


 Чтобы ОБНОВИТЬ пакеты программ для Python в PyCharm (Allure, Pytest, Selenium, BrowserStack Local, Pip, Cryptography, myOpenSSL, Webdriver Manager и другие):

1. PyCharm - Preferences

2. Project (там должен быть указан ваш проект) - Python Interpreter


3. В первой колонке видим все уже установленные пакеты, во второй - текущая версия пакета, в трeтьей - доступная последняя версия.
Если текущая и последняя версия не совпадают, то мы видим треугольник возле Latest Version, это означает, что мы можем ее обновить.



4. Для того, чтобы обновить пакет ставим курсор на нужную строку (в примере выше это attrs), кликаем на треугольничек внизу (выделила его на рисунке). Пакет обновится.



Установить ALLURE для Mac (Мак)

 Чтобы установить Allure (Алюр) на ваш компьютер в Терминале введите следуюший текст:




- для Mac

brew install allure

вторник, 20 октября 2020 г.

Switch to iFrame - Если нужно переключиться на frame и обратно

Например, существует иконка Помощника (Help), которая должна отображаться на всех страницах вебсайта. Пользователь может кликнуть на нее и пообщаться с Службой поддержки.

Сейчас существует много сервисов, которые позволяют использовать их инструмент для такого окна - Intercom, Helpscout, Zendesk....


АВТОТЕСТ:

- Проверить, что иконка помощника отображается на странице. 

Открываем trial_download_signup_page старницу.

Переключаемся на Frame, где эта иконка находится. Потом ищем иконку, проверяем ее видимость на странице и переключаемся обратно на исходную страницу.

Дальше нам надо еще ввести и-мейл, согласиться с условиями и кликнуть кнопку Download.

На открывшейся старницы мы тоже проверяем наличие Help иконки.


Для переключения на рамку будем использовать функцию - switch_to_frame 

Для возвращения на исходную страницу - switch_to_default_content


def test_user_should_see_help_icon_on_trial_download_signup_page(driver):
trial_download_signup_page.open(driver)
assert trial_download_signup_page.help.is_icon_displayed(driver), \
"Help icon is not displayed on Trial Download Signup page"
driver.switch_to_default_content()
trial_download_signup_page.set_email(driver, TestData.get_random_email())
trial_download_signup_page.agree_to_terms_and_policy(driver)
trial_download_signup_page.click_download_button(driver)
assert trial_download_signup_page.help.is_icon_displayed(driver), \
"Help icon is not displayed on SA Signup Follow page"

in Help file:

@allure.step("Check if Help icon is displayed on the page")
def is_icon_displayed(driver):
iframe = HtmlElement(driver, (By.CSS_SELECTOR, "selector"
]'))
iframe.
switch_to_frame()
help_icon = HtmlElement(driver, (By.CSS_SELECTOR, "selector"
]'))
return helpscout_icon.is_element_visible()

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

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