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


(Валентин Розловенко) #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 файлов


(Mykhailo Poliarush) #21

PageObject это всего лишь дополнительная абстракция, которая помогает разделить создание тестов от фактического взаимодействия с веб-приложениями. Конечно это можно сделать через кейворды RobotFramework. Кейворды как раз и для этого предназначены.

Другой вопрос, если нужно будет запрограммировать какую то логику в самых PageObjects, то насколько это будет просто сделать с помощью selenium2library или с помощью чистого программирования на Python?!

Моя практика показывает, что все же как не старайся, но запрограммировать логику PageObjects через кейворды selenium2library тяжело и получается слишком линейно. А в жизни много подводных камней, к которым надо приделывать разные воркараунды и с помощью чистого программирования на Python это значительно проще.


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

Даже не буду спорить , просто подход на чистом рб на мой взгляд будет крайне удобен тем , у кого нет навыков программирования , и они не планируют их получать :slight_smile:


(Dmitriy Zverev) #23

На самом деле, просто надо выставить правильный PYTHONPATH.

У меня именно так сейчас реализовано. Не скажу, что я доволен этим подходом.

  • Организация кода python гораздо гибче, чем каталоги каталогов robot framework + python код даёт больше свободы для изощрённых случаев
  • В моём случае я уже наследую SeleniumLibrary для хитрых запросов и другое решение вполне для меня вписывается в архитектуру

(Mykhailo Poliarush) #24

Вот вроде бы да, и многие так говорят, многие даже берутся за автоматизацию без знаний программирования, но в итоге, к сожалению, ничего хорошего из этого не получается. Из своей практики я встречал много таких случаев и не помню ни одного успешного кейса, все в какой-то мере начинали программировать (даже если не хотели) и развивали правильные подходы к автоматизации через программирование.

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

Что еще раз доказывает, надо программировать 80% логики на python, а 20% на robot framework. Принцип Парето даже тут действует :smile: