Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Robot Framework + PyCharm или как запустить\совместить python webdriver unittest тесты совместно с RF кейвордами


(Sergii Fedosov) #1

Установил Robot Framework к Pycharm все роботает (здесь туториал как ето сделать Запуск Robot Framework из PyCharm)

У меня есть несколько готовых тестов в WebDriver (python), можно ли использовать етот тест как библиотеку в Robot Framework? Потом создать для него keyword чтоби на виходе он мне возвращал 1 или 0 в случае eсли тест прошел успешно? Если можно это сделать иначе тогда как?


(Валентин Розловенко) #2

А что вам мешает этот тест сделать как кейворд посредствам Selenium2Library ? И добавить к нему FOR Loop ?


(Sergii Fedosov) #3

Тестов много и много функции соответственно, все тести имееют asserty, в случае чего тест остановится если assert не проходит. Потому для начала хочу сделать 1 keyword который будет возвращать результат (например 1 или 0) что тест прошел. Вопрос как это сделать?


(Sergii Fedosov) #4

@extr3mal как можно сделать этот тест как кейворд посредствам Selenium2Library напишите пожалуйста ?


(Валентин Розловенко) #5

Вам нужно чтоб работало как в питоне или в зависимости от наличия отсутсвия возвращало 1 или 0 соответственно ?

Почитав селениум2либрари кейворды понял что за ассерт по тексту в элементе отвечает “Element text should be

Код по логике должен быть таким :

Open Browser    http://www.test.com/panel    browser=gc
Input Text    id=login    abcdef
Input Password    id=password    abcdef
Click Element    css=input.submit
Wait Until Page Contains Element    id=user--test--test2
Click Element    id=user--test--test2
Element Text Should Be    css=yourlocator    yourtext    message=yourerrrormessage

Если вы хотите получать по ассерту 0 или 1 то там другая методика . Например использовать “Run Keyword If” в связке с “Run Keyword Unless” входящие в состав библиотеки “Built In”

В таком случае вы будете делать немного иначе и пример будет выглядеть по другому вот несколько примеров как и да простят меня за линки в гуглогруппы


(Dmitriy Zverev) #6

Из того кода, что я увидел на скриншоте, я могу предположить, что Banner.py уже может использоваться как библиотека.
Но почему-то вы подключаете его, как ресурс.
Зачем вам возвращать 1 или 0, если assert, как я помню, может вполне обрабатываться роботом.


(Mykhailo Poliarush) #7

В общем, вряд ли ваш поход зараборает, так как Вы строите ваши тесты на unittest, где ожидаете инициацию различных фикстур через setUp tearDown методы. Но если Вы создадите весь код в обычных методах без setUp tearDown, то скорее всего должно сработать. Хотя надо проверять, у меня сомнения.

Соглашусь с @extr3mal если у вас такие простые тесты, то тогда лучше перепишите их с помощью Selenium2Library https://github.com/rtomac/robotframework-selenium2library Хотя такие тесты будут выглядеть громоздкими.

А вообще, я бы вам рекомендовал отделить взаимодействие с веб-приложением, разработку кейвордов и разработку тестов. Схема где-то плюс минус такая:

  1. Пишите логику на python в обычных модулях с помощью PageObject и т.д.
  2. Создаете класс с набором методов, которые и будут кейвордами по работе с вашими приложениями
  3. А сами методы (кейворды) наполняете python кодом, который построили на основании PageObject в пункте 1

Надеюсь схема понятна


(Sergii Fedosov) #8

Спасибо extr3mal. Так чтобы работало как в python. Думаю для начала буду использовать Run Keyword if и Run Keyword Unless чтобы попробовать прогнать тест


(Sergii Fedosov) #9

Да соглашусь с Вами исправлю на библиотеку. Можете показать пример как это сделать на основании assert?


(Sergii Fedosov) #10

Потому решил использовать 1 keyword который мне бы возвращал на виходе что тест прошел успешно, в то время как assert’s делали бы свое дело в тесте.
PageObject + python гораздо лучше чем обычный бот стиль в тестах, думаю перейти со временем на PageObject. Есть ли хороший туториал, который бы описал весь процесс (или по оддельности) создания тестов (python) в PageObject и имплементация их к Robot Framework ?
Спасибо большое


(Mykhailo Poliarush) #11

Вот есть хороший пример на github https://github.com/adamgoucher/robotframework-pageobjects

Код выглядит так

from SeleniumWrapper import SeleniumWrapper as wrapper

locators = {
    "email": "id=Email",
    "password": "id=Password",
    "sign in": "id=submit",
    "error messages": "css=.validation-summary-errors li"
}

class SignInPage(object):
    def set_sign_in_email_as(self, email):
        se = wrapper().connection
        se.type(locators["email"], email)

    def set_sign_in_password_as(self, password):
        se = wrapper().connection
        se.type(locators["password"], password)

    def submit_sign_in_credentials(self, success=False):
        se = wrapper().connection
        se.click(locators["sign in"])
        se.wait_for_page_to_load("20000")

    def sign_in_error_message_should_be(self, message):
        se = wrapper().connection
        assert se.get_text(locators['error messages']) == message
from homepage import HomePage
from signinpage import SignInPage

class PageObjects(HomePage, SignInPage):
    # your top-level keywords here

а тест вот так

*** Settings ***

Documentation  A test suite with a single test for valid login. This test has
...            a workflow that is created using keywords from the resource file.
Resource       common_resource.txt
Test Setup    Open Browser To English Home Page
Test Teardown  Close Browser After Run

*** Test Cases ***

Invalid Login
    Navigate To Sign In Page
    Set Sign In Email As    demo
    Set Sign In Password As    demo
    Submit Sign In Credentials

[Заметка] Использование Page Object в Robot Framework
(Dmitriy Zverev) #12

Спасибо за ссылку. Наконец-то я расставил все точки в вопросе реализаций page object + robot framework. Единственное замечание: я бы локаторы вынес в отдельный python-файл


(Mykhailo Poliarush) #13

Ну это как смотреть на реализацию PageObject. Можно сделать по разному, а как удобнее, каждый решает сам. Я, например, придерживаюсь правила чтобы все локаторы относящиеся к конкретному PageObject были в одном модуле с реализуемым PageObject, чтобы меньше было тело движений в поиске и починке конкретного локатора. Если же у вас становиться слишком много локаторов в одном модуле, значит надо задуматься о правильной реализации PageObject. Может быть надо что-то модуляризировать, что-то разбить на более мелкие логические части.


(Валентин Розловенко) #14

Михаил , а можно по подробней о том как настроить сей тестовый пример для работы с пайчарм билдером ?


(Mykhailo Poliarush) #15

Конечно этот пример большой давности (3 года уже), но я думаю можно заставить его заработать и в PyCharm.
В общем, времени как всегда у меня не так много и поэтому время ценно для меня. Соответственно, я могу помочь с этой задачей по скайпу, но тогда надо будет помочь нашему сообществу автоматизаторов и стать более активным участником (начать производить контент, а не только задавать вопросы), т.е. меняю консультацию на заметку или code recipe в нашу базу знаний по полученным знаниям.

Как сделали уже другие участники Запуск Robot Framework из PyCharm или [Code Recipe] Получение дебаг-информации об упавшем webdriver тесте в py.test


(Sergii Fedosov) #16

Какой кейворд можно использовать чтоб прогнать тест без переписывания тестов в Selenium2 Library? Так как Run Keyword if, Run Keyword Unless не подходят в этом случае.
Тест подключен как библиотека может быть keyword “Get Library Instance”- Returns the currently active instance of the specified test library с библиотеки BuiltIn ?


(Валентин Розловенко) #17

Попробуйте что нить из Operating System library как вариант может сработать Run And Return RC


(Sergii Fedosov) #18

Думаю этот пример должен работать с использованием Operating System library. Может пригодится кому то

Example

Setting	Value
Library	OperatingSystem

Variable	Value
${PATH}	${CURDIR}/example.txt

Test Case	Action	Argument	Argument
Example	Create File	${PATH}	Some text
File Should Exist	${PATH}	
Copy File	${PATH}	${TEMPDIR}/stuff
${output} =	Run	${CURDIR}${/}script.py arg

(Валентин Розловенко) #19

Нашел интересное описание паттерна PageObject на Robotframework без подмешивания питона


(Валентин Розловенко) #20

Пример который привел Михаил поправлен и может быть найден по адресу

Фикс содержит по путям для py файлов реализующих PageObject функционал, внутри robot файлов