Попытка выбрать переключатель из пользовательского атрибута в Watir-Webdriver

Неужели это невозможно? Я добавил код для расширения возможности выбора пользовательских селекторов:

module Watir
  class ElementLocator    
    alias :old_normalize_selector :normalize_selector

    def normalize_selector(how, what)
      case how
        when :data_sku
          [how, what]
        else
          old_normalize_selector(how, what)
      end
    end
  end
end

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

$monthlydata = ["GC311Z-02","GC307Z-02","GC308Z-02","GC309Z-02","GC310Z-02"].sample
#Watir::Wait.until { @b.radio(:data_sku, $monthlydata) }
#@b.radio(:xpath, "//input[@data_sku='$monthlydata']").exists?
@b.radio(:xpath, "//input[@data_sku='$monthlydata']").set **(line causing the error)**

Я получаю сообщение об ошибке UnknownObjectException: невозможно найти элемент. Строка, которая выдает ошибку, является последней показанной.

ОБНОВИТЬ

Мой обновленный код получает ошибки тайм-аута:

    if @b.url == "http://www.website.com/cart/plans?ProductId=product"
        $monthlydata = ["GC311Z-02","GC307Z-02","GC308Z-02","GC309Z-02","GC310A-02"].sample
        assert @b.radio(:data_sku, $monthlydata).when_present.set
    end

    $monthlymin = ["GC504Z","GC505Z","GC506Z","GC507Z","GC508Z"].sample
    assert @b.radio(:data_sku, $monthlymin).when_present.set

    $monthlytxt = ["GC313Z-02","GC314Z-02","GC315Z-02","GC316Z-02","GC320Z-02"].sample
    assert @b.radio(:data_sku, $monthlytxt).when_present.set

Трассировки стека:

Error: test_goproject(TestShoppingCart)

  Watir::Wait::TimeoutError: timed out after 30 seconds, waiting for {:data_sku=
>"GC309Z-02", :tag_name=>"input", :type=>"radio"} to become present

C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.6.7/lib/watir-webdriver/wa
it.rb:33:in `until'

C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.6.7/lib/watir-webdriver/wa
it.rb:106:in `method_missing'

C:/Users/User.Name/Downloads/shoppingcart2.rb:95:in `test_goproject'

     92:
     93:                if @b.url == "http://www.website.com/cart/plans?ProductId=product"
     94:                        $monthlydata = ["GC311Z-02","GC307Z-02","GC308Z-
02","GC309Z-02","GC310Z-02"].sZmple
  => 95:                        assert @b.radio(:data_sku, $monthlydZtZ).when_pr
esent.set
     96:                end
     97:
     98:                $monthlymin = ["GC504Z","GC505Z","GC506Z","GC507Z","GC50
8Z"].sample

1 ответ

Решение

Я предполагаю, что переключатели на вашей странице имеют html вроде:

<input type="radio" data-sku="GC311Z-02" />

Решение 1 - локатор атрибутов данных

Watir уже поддерживает поиск элементов с помощью пользовательских атрибутов данных. Там нет необходимости делать какие-либо исправления normalize_selector метод.

Вы правильно определяете локатор атрибутов данных, когда делаете:

@b.radio(:data_sku, $monthlydata)

Тем не менее, строка:

Watir::Wait.until { @b.radio(:data_sku, $monthlydata) }

Не будет делать то, что вы ожидали. Watir::Wait.until будет ждать, пока блок не станет истинным. Линия @b.radio(:data_sku, $monthlydata) всегда будет возвращать истинное значение, так как оно возвращает объект элемента Watir (объект, который еще не был найден). Поэтому ждать никогда не ждет. Блок должен проверить наличие элемента:

Watir::Wait.until { @b.radio(:data_sku, $monthlydata).present? }

Тем не менее, вы можете сократить это до:

@b.radio(:data_sku => $monthlydata).wait_until_present

Или, так как вы хотите установить переключатель:

@b.radio(:data_sku => $monthlydata).when_present.set

Решение 2 - Xpath

Хотя в этом сценарии я не рекомендую использовать маршрут xpath, это возможно. Причина в том, что линия:

@b.radio(:xpath, "//input[@data_sku='$monthlydata']").set

не в том, что $monthlydata неправильно вставлен. Как написано, xpath говорит, что нужно найти атрибут data-sku, который имеет значение "$ monthddata" (а не значение, которое было выбрано случайным образом).

Вам нужно сделать интерполяцию строки так, чтобы $monthlydata на самом деле интерпретируется, а не буквально. Кроме того, xpath требует @data-sku вместо @data_sku:

@b.radio(:xpath, "//input[@data-sku='#{$monthlydata}']").when_present.set
Другие вопросы по тегам