Перейти к содержимому

Публикации vladMat

13 публикаций создано vladMat (учитываются публикации только с 29 марта 2023)


#178558 Помогите, пожалуйста, написать условие...webdriver JS firefox

Отправлено автор: vladMat 07 января 2021 - 06:47 в Selenium - Functional Testing

Вот вам 2 ссылки где можно посмотреть примеры xpath
содержит текст

не содержит класс

 

А код ругается, потому что вы у локатора пытаетесь вызвать метод GetAttribute, которого у него нет, вызывать нужно у элемента на странице. (проблема в скобках)




#178556 Загрузка файла

Отправлено автор: vladMat 07 января 2021 - 06:40 в Selenium - Functional Testing

Очень похоже что неправильно определен контекст self.driver. self.driver должен инициализироваться в BasePage, тогда в методы BasePage попадет правильный контекст.

Первое что могу предложить, это убрать в функции do_send_keys - WebDriverWait(self.driver, time).until(EC.visibility_of_element_located(locator),
message=f"Не нашел куда написать. Адрес: {locator}")
Для пробы заменить их на time.wait и self.driver.find_element(*locator).send_keys(text)


 




#178476 Проблема в Pytest BDD тест запускатется, но некоторые шаги не работают

Отправлено автор: vladMat 22 декабря 2020 - 04:15 в Тест-дизайн и ручное тестирование

Не вижу связи с pytest bdd. У вас на скриншоте исключение выбросил селениум elementclickinterceptedexception. Выше по трассировки есть место в вашем коде которое исполнялось, вот там и копать надо дальше. Отладка в консоль + временные задержки




#177751 Selenium + python + Kendo

Отправлено автор: vladMat 19 октября 2020 - 19:17 в Selenium - Functional Testing

Ок, какие есть варианты:
1. Неправильный контекст browser, возможно браузер ищет не на нужной странице. Можно попробовать найти элемент body взять innerHTML и проверить поиском что элемент '#Category_listbox li' есть в body
2. Возможно на странице есть iframe, тогда вначале нужно провалиться в этот iframe

3. Возможно элемент появляется на странице динамически, проверяется добавлением задержки в 5-10 секунд перед кликом

4. Можно отдебажить через console.log, подсовывая разные элементы, это все через execute_script

5. То же что и в 4 пункте, но с помощью alert




#177717 Selenium и Appium в одном тесте

Отправлено автор: vladMat 15 октября 2020 - 04:50 в Автоматизированное тестирование

А вас не смущает что вы импортировали webdriver из appium а потом перезаписали этот webdriver, другим webdriver из selenium?

from appium import webdriver as appium_webdriver
from selenium import webdriver as selenium_webdriver

Если и так не заработает, то могу предложить отказаться от использования браузера, а сделать проверку кода с помощью запроса на сервер (библиотека requests), в response проверите финальный урл, если залогинен, то тест положителен




#177716 Извлечение лога из Firefox. Получаю ошибку HTTP method not allowed.

Отправлено автор: vladMat 15 октября 2020 - 04:38 в Selenium - Functional Testing

Могу предложить:
1. Воспользоваться сторонними интеграциями типа Sentry (exceprionы отправляет сервер)

2. Смотреть серверные логи




#177714 Selenium + python + Kendo

Отправлено автор: vladMat 15 октября 2020 - 04:28 в Selenium - Functional Testing

Так я выбрал элемент из списка (список с пунктами можно предварительно не открывать)

document.querySelectorAll('#categories_listbox li')[2].click()

[2] - третий элемент в списке

Другой способ:
Как говорил раньше, есть скрытый инпут, который и передает на сервер значение (номер) выбранной категории https://prnt.sc/uzl5as
 

Если знаете чем заполнять, то можно сразу инпут заполнить

document.querySelector('#categories').value = "3"

Если изначально неизвестно чем заполнять, то значение можно получить так:

document.querySelectorAll('#categories_listbox li')[2].dataset.offsetIndex



#177698 Selenium + python + Kendo

Отправлено автор: vladMat 13 октября 2020 - 01:22 в Selenium - Functional Testing

Честно говоря, на словах тяжело понять что вам надо.

1. в span нельзя задать какой-то элемент из списка. Возможно значение элемента передается в скрытый input или select

2. на практике была проблема с react приложением и execut_script - самое простое, добавить временную задержку, посложнение - Webdriver.wait




#177671 Selenium + python + Kendo

Отправлено автор: vladMat 04 октября 2020 - 22:24 в Selenium - Functional Testing

Попробуйте не использовать jquery. Воспользуйтесь базовым синтаксисом js: document.querySelector() илил document.getElementById




#177368 Selenium+Python+Page Object, работа с Select

Отправлено автор: vladMat 19 августа 2020 - 03:29 в Selenium - Functional Testing

Не уверен, что это "правильный" вариант, но могу предложить:

1) тесту точно не нужно знать об объекте select

2) В объекте корзины я бы создал вложенный объект товар

class CartPage(ProductDetailPage):
    class Product:
        def __init__(self, browser)

        def select_size(self, value):
            select = Select(self.browser.find_element*CartPageLocators.SELECT_SIZE)
            select.select_by_index(value)

Тогда вызов в тесте будет:

cart_page.Product().select_size(1)



#177367 Postman: Как взять значение переменной из url ответа?

Отправлено автор: vladMat 19 августа 2020 - 03:12 в Автоматизированное тестирование

Как минимум можно воспользоваться регулярным выражением




#177302 Selenium Python Safari не выводятся ошибки

Отправлено автор: vladMat 06 августа 2020 - 05:21 в Автоматизированное тестирование

0) В safari включили возможность автоматизированного управления?

1) Какую команду для запуска используете?

2) Какой stack trace?

3) В какой среде запускаете выполнение кода?




#177110 Как в автотестах python+selenium делать полностаничные скриншоты?

Отправлено автор: vladMat 02 июля 2020 - 03:25 в Автоматизированное тестирование

Была у меня аналогичная задача. Стандартное .find_element_by_xpath(location).screenshot_as_png работало хорошо в firefox, в chrome не работало, если не ошибаюсь. Тогда в интернете нашел вариант ниже. Он снимает скриншот видимой области, прокручивает страницу, делает еще скриншот, и так далее. Потом все это склеивает в один скриншот. Данное решение работает в firefox, chrome, safari. Проблема возникнет, если на сайте есть закрепленные элементы, на склеенном скриншоте они будут повторяться (пример: закрепленная шапка сайта в мобильной версии)

 .

from io import BytesIO
from selenium import webdriver
from PIL import Image, ImageChops, ImageDraw


def full_screenshot(browser: webdriver, offset: int = 0) -> Image:
    """ Получение полного скриншота содержимого окна браузера
        offset - начальное смещение"""

    img_list = []  # для хранения фрагментов изображения

    # Определение размера окна браузера
    height = browser.execute_script("""return Math.max(
                                           document.documentElement.clientHeight,
                                           window.innerHeight
                                       );""")

    # Определение высоты содержимого окна браузера
    max_window_height = browser.execute_script("""return Math.max(
                                                      document.body.scrollHeight,
                                                      document.body.offsetHeight,
                                                      document.documentElement.clientHeight,
                                                      document.documentElement.scrollHeight,
                                                      document.documentElement.offsetHeight
                                                  );""")

    # Скроллим страницу и добавляем скриншот видимого окна браузера в img_list
    while offset < max_window_height:
        browser.execute_script(f"window.scrollTo(0, {offset});")

        img = Image.open(BytesIO((browser.get_screenshot_as_png())))
        img_list.append(img)

        offset += height

    # Обрезание последнего изображения
    box = (0, height - height * (max_window_height / height - max_window_height // height), img_list[-1].size[0],
           img_list[-1].size[1])
    img_list[-1] = img_list[-1].crop(box)

    # Определение размеров нового изображения, создание холста
    img_frame_height = sum([img_frag.size[1] for img_frag in img_list])
    img_frame = Image.new('RGB', (img_list[0].size[0], img_frame_height))

    # Объединение изображений в одно
    offset = 0
    for img_fragment in img_list:
        img_frame.paste(img_fragment, (0, offset))
        offset += img_fragment.size[1]

    return img_frame