• Есть ли хороший пример page object pattern на python?

    lxsmkv
    @lxsmkv
    Test automation engineer
    у нас свой фреймворк, мы делаем end-to-end тестирование embedded системы через GUI.
    я не выношу локаторы, они прописаны в классе в функциях.
    Некоторые у нас выносят в локаторы в отдельные файлы. Можно и так, однако я не вижу преимущества.
    Так я точно знаю какие локаторы относятся к какой странице. Начала вылетать функция, поправил локатор, не стало страницы, выкинул, поправил последовательность в тесте. Старые локаторы "автоматически" удаляются вместе со старыми page-объектами.
    В нашем случае нам не приходится ссылатъся на один и тот же элемент в рамках разных страниц, потому что у нас дерево виджетов построено от страницы, и даже если виджеты одинаково называются это совершенно разные обьекты. В веб-тестировании, однако, это не так, поэтому аргумент резонный.
    tf тут это ссылка на тест-фреймворк, который дает нам базовые функции для взаимодействия с GUI.
    class LoginView:
    	def __init__(self):
    	  self.viewname='ABC'
    	def enter(self):
    	  tf.executeApiCall()
    	def wait_for_view(self):
    		tf.wait_for_view(self.viewname)
    	def press_cancel_button(self):
    		tf.press_widget('xyz.ABC')
    	def enter_username(self, u):
    		tf.enter_string('xyz.ABC.inputfield', u)
    	def check_error_popup_visible(self,expect):
    		if expect==True:
    			tf.wait_for_view(view='xyz.ABC.LoginErrorPopup')
    		else:
    	 		tf.wait_for_view(notinview='xyz.ABC.LoginErrorPopup')
    	def press_login_button(self):
    		tf.press_widget('xyz.ABC.Login')

    на стороне теста выглядит как-то так
    username='Kolya'
    main_view = MainView()
    login_view = LoginView()
    login_view.enter()
    login_view.wait_for_view()
    login_view.enter_username(u=username)
    login_view.press_login_button()
    login_view.check_error_popup_visible(expect=True)
    login_view.confirm_error_popup()
    login_view.check_error_popup_visible(expect=False)
    login_view.check_inputfield_text_equals(expect=username)
    login_view.leave()
    main_view.wait_for_view()
    Ответ написан
    Комментировать
  • Как сделать портфолио?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Все просто: jsfiddle.net/b33wT

    <div class="menu">
        Выбираем:
        <button class="btn" data-type="design">Дизайн</button>
        <button class="btn" data-type="html">Верстку</button>
        <button class="btn" data-type="php">Программирование</button>
        <button class="btn" data-type="all">Всё</button>
        <button class="btn" data-type="none">Ничего</button>
    </div>
    
    <div class="portfolio">
        <div class="item type_design">Дизайн 01</div>
        <div class="item type_design">Дизайн 02</div>
        <div class="item type_design">Дизайн 03</div>
        <div class="item type_html">Верстка 01</div>
        <div class="item type_html">Векстка 02</div>
        <div class="item type_html">Верстка 03</div>
        <div class="item type_php">Программирование 01</div>
        <div class="item type_php">Программирование 02</div>
        <div class="item type_design type_html">Дизайн + Верстка 01</div>
        <div class="item type_design type_html">Дизайн + Верстка 02</div>
    </div>


    var $buttons = $(".btn"),
        $items = $(".item"),
        type;
    
    $buttons.on("click", function () {
        type = $(this).data("type");
        selectItems();
    });
    
    var selectItems = function () {
        switch (type) {
            case "all":
                $items.show();
                break;
            case "none":
                $items.hide();
                break;
            default:
                $items.hide();
                $items.filter(".type_" + type).show();
                break;
        }
    };
    Ответ написан
    4 комментария