2015-03-17 2 views
0

Я пытаюсь избежать команды sleep(), поэтому я хочу заменить его более умными функциями, такими как wait_for_element_exists(), но они, похоже, не работают под iOS. Пример:Calabash iOS - wait_for_element_exists не работает

touch("button marked:'button_in_the_first_view'") 
wait_for_element_exists("button marked:'button_in_the_second_view'") 
touch("button marked:'button_in_the_third_view'") 

кальян не ждет второй кнопки, которые будут отображаться на экране, переходит к строке 3 без каких-либо задержек и не проходит тест

Если я пытаюсь определить свойства вторая кнопка это сразу же доступны, все еще включен и не скрыты, несмотря на то, что вид навигации контроллер не закончил толкающий анимацию с первого взгляда:

touch("button marked:'button_in_the_first_view'") 
query("button marked:'button_in_the_second_view'").count # => 1 
query("button marked:'button_in_the_second_view'", :isEnabled).first # => 1 
query("button marked:'button_in_the_second_view'", :isHidden).first # => 0 

заранее спасибо за вашу помощь,

Michał

+0

Я знаю, что это не тот ответ, который вы ищете. Но я столкнулся с подобными проблемами, и в некоторых случаях обнаружил необходимость комбинировать sleep() и wait_for, потому что wait_for запускался, прежде чем компонент пользовательского интерфейса мог быть использован. – Lasse

ответ

1

wait_for_elements_exist() работает. Вам нужно выяснить, где это неправильно срабатывает. Как говорит Лассе, иногда вам нужно использовать наименьший сон (0,3) для соответствия скорости анимации. Есть варианты по методу wait_for_elements_exist как

wait_for_elements_exist(elements_arr, 
    { 
    :timeout => 10, #maximum number of seconds to wait 
    :retry_frequency => 0.2, #wait this long before retrying the block 
    :post_timeout => 0.1, #wait this long after the block returns true 
    :timeout_message => "Timed out waiting...", #error message in case options[:timeout] is exceeded 
    :screenshot_on_error => true # take a screenshot in case of error 
    } 
) 

использования Try эти опции, element_exists() функции и некоторые UI запрос, чтобы выяснить, что на самом деле произошло на экране? Каковы состояния кнопок и что произойдет в следующую секунду?

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

Then /^I should see "([^\"]*)" button isEnabled$/ do |text| 
    state = query("button marked:'#{text}'", :isEnabled)[0] 
    state = state.to_i 
    if state!=1 
     screenshot_and_raise "Current state is not enabled for button: #{text}" 
    end 
    sleep(STEP_PAUSE) 
end 



Then /^I touch the "([^\"]*)" button after it appears$/ do |name| 
     element = "button marked:'#{name}'" 
     if element_does_not_exist(element) 
     wait_for_elements_exist([element], :timeout => 10) 
     sleep(STEP_PAUSE) 
     touch(element) 
     sleep(0.3) 
     elsif element_exists(element) 
     touch(element) 
     sleep(0.3) 
     else 
     screenshot_and_raise "'#{name}' Button isnt exsist." 
     end 
    end 

Здесь я добавляю advance wait functions on calabash. Проверьте, можете ли вы найти решение там.

+0

К сожалению, это не сработает. Предложение first if ('if element_does_not_exist (element)') никогда не посещается (я пробовал много примеров). Кроме того, если я просто вызываю 'wait_for_elements_exist ([element],: timeout => 10,: post_timeout => 0,5)', но отображение элемента в представлении длится более 0,5, оно всегда терпит неудачу. – Kaktusiarz

+0

Может быть, ваш элемент кнопки уже существует и неактивен. вам может потребоваться использовать wait_for_animations_to_finish() «Иногда вам нужно спать (ждать завершения анимации)» Читайте здесь в ожидании https://github.com/calabash/calabash-android/blob/master/documentation/ruby_api .md –

Смежные вопросы