Как работает несколько локаторов для элемента? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть следующее HTML:

<a class="js-open-modal suspend" data-track-event="interacted_with_account_manage_settings_web" 
 data-track-properties="{&quot;location&quot;:&quot;clients&quot;,&quot;button_clicked&quot;:&quot;Suspend&quot;}" data-track="always"
href="/client_suspension/new?client_id=86">Suspend</a>

, и я объявил элемент (кнопку) с этими двумя локаторами:

link(:suspend_button, :class => ["js-open-modal", "suspend"])
link(:suspend_button, :visible_text => 'Suspend')

Я пытался "сломаться" первый локатор: link(:suspend_button, :class => ["blah-blah-blah-blah", "suspend"]) и тест работает со вторым локатором: link(:suspend_button, :visible_text => 'Suspend').

Это обеспечивает упругие тесты.

Но если я "сломал" второй локатор link(:suspend_button, :visible_text => 'Ssssssuspend'), чем тест не работает с первым локатором: link(:suspend_button, :class => ["js-open-modal", "suspend"]).

Страница есть:

class MyClientsPage < Base
  include PageObject


  link(:suspend_button, :class => ["js-open-modal", "suspend"])
  link(:suspend_button, :visible_text => 'Suspend')

end

и тест:

require 'spec_helper'
require "rspec/expectations"

describe 'Partner/client switch' do

  it 'Client account is suspended' do
    on(MyClientsPage).suspend_button
  end
end

Что такое волхвы c позади сцены при объединении нескольких локаторов с помощью Watir? Не могли бы вы поделиться больше примеров. Большое спасибо заранее!

1 Ответ

0 голосов
/ 28 апреля 2020

Когда объект страницы определяет несколько методов доступа с одинаковыми именами, не существует волшебных c для объединения локаторов. Вместо этого выигрывает последнее определение.

Методы доступа, например, link, динамически определяют методы для объекта страницы. Фактически объект страницы:

    class MyClientsPage < Base
      include PageObject

      link(:suspend_button, :class => ["js-open-modal", "suspend"])
      link(:suspend_button, :visible_text => 'Suspend')
    end

преобразуется во что-то вроде:

    class MyClientsPage < Base
      include PageObject

      def suspend_button
        browser.link(:class => ["js-open-modal", "suspend"]).click
      end

      def suspend_button
        browser.link(:visible_text => 'Suspend').click
      end
    end

Как и для всех Ruby (не указывается c для Watir или Page-Object) Если вы определяете один и тот же метод дважды, последнее определение в основном перезаписывает предыдущее. Вот почему вы можете изменить первый метод доступа без какого-либо влияния - ie вы изменяете определение, которое выбрасывается.

Если вы хотите найти ссылку, которая имеет указанный c класс и видимый текст, вам нужен один метод доступа:

    class MyClientsPage < Base
      include PageObject

      link(:suspend_button, :class => ["js-open-modal", "suspend"], :visible_text => 'Suspend')
    end
...