¿Cómo leo el text de una alerta (ios) en calabash

¿Cómo puedo acceder al text de una vista de alerta en iOS en mis testings de calabaza / pepino ?

NSString *msgString = [NSString stringWithFormat:@"No: %@\n Latitude: %f\n Longitude: %f", wrapper.no, wrapper.latitude, wrapper.longitude]; UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Really reset?" message:@"msgString" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil] autorelease]; // optional - add more buttons: [alert addButtonWithTitle:@"Yes"]; [alert show]; 

Quiero afirmar que la alerta tiene el contenido esperado:

 Feature: Running a test As a user using a phone connected to the internet I want to have correct sample data retrieved from cache or net So I can read the values of the tableview Scenario: Testing retrieved data Given the app is running Then I press "Refresh" Then I should see "Some value" Then I press "Some value" Then I should /*See an alert with "myMessage"*/ Then I press "OK" And take picture 

Así que si cambio la cadena a simplemente "No:" y descartes todo lo demás de la cadena, realmente parece funcionar, pero no puedo hacerlo funcionar con mi cadena más compleja 🙁

Probé este código y funciona bien

file de definición de pasos internos (ProjectName / features / step_definitions / my_first_steps.rb) add

 Then /^I see an alert with "([^\"]*)" text$/ do |message| result = query("view:'UIAlertView' label text:'#{message}'").empty? if result screenshot_and_raise "could not find text field with AlertView with text '#{message}'" end sleep(STEP_PAUSE) end 

y en el file de características

 Then I see an alert with "Email cannot be empty." text 

si el text no coincide con el post, se tomará una captura de pantalla y no se realizará la testing.

¡Pero esto funciona para sus alertas personalizadas, no para las alertas del sistema …!

esto lo ayudará si necesita leer el post de alerta

abrir $ calabash-ios console y

consulta como query("view:'UIAlertView'",:message)

añadir más….

O puede usar algo como

 Then /^I wait until alert with text "([^\"]*)" and press "([^\"]*)" button$/ do |message, button| wait_for_elements_exist(["alertView child label marked:'#{message}'"], :timeout => 30, :retry_frequency => 0.3,:timeout_message => "Timed out waiting..",:screenshot_on_error => true ) if element_exists("alertView child label marked:'#{message}'") touch("button marked:'#{button}'") sleep(STEP_PAUSE) else screenshot_and_raise "Alert Element not found" end end 

Para iOS 7 y superior: el siguiente código de calabash funcionará bien.

 Then I should see "your text here" And I should see "Call XXX" And I should see "Cancel" 

Funciona para mi.

Una solución para agregar soporte de nueva línea es sacar las variables de la cadena en las funciones para que la nueva línea pueda agregarse mediante el código ruby:

 Then I see a popup with latitude 10 and longitude 20 

Llamadas:

 Then /^I see a popup with latitude (\d+) and longitude (\d+)$/ do |lat, lon| msg = "Latitude:#{lat}\nLongitude:#{lon}" should_see_alert_with_text msg end 

Utilizando:

 def should_see_alert_with_text (text) wait_poll(:until_exists => 'alertView', :timeout => 5) do actual = query('alertView child label', :text).first unless actual.eql? text screenshot_and_raise "should see alert view with message '#{text}' but found '#{actual}'" end end end 

El enlace al problema de calabash-ios fue enterrado en los comentarios.

https://github.com/calabash/calabash-ios/issues/149

En ese tema, proporciono un ejemplo de cómo manejar la búsqueda de text con nuevas líneas.

Karl también sugiere escribir el paso con varias líneas ("líneas")

 Then I see an alert with text: """ Latitude:59 Longitude:17 """