Question

How can I access the text of an alertview on iOS in my calabash/cucumber tests?

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];

I want to assert that the alert has the expected content:

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

So if i change the string to simply "No:" and discard everything else from the string, it does actually seem to work, but i cant get it running with my more complex string :(

Was it helpful?

Solution 3

A solution to add newline support is to take the variables out of the string in the features so that the newline can be added by the ruby code:

Then I see a popup with latitude 10 and longitude 20

Calls:

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

Using:

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

OTHER TIPS

I tested this code and its working fine

inside step definition file (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

and in feature file

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

if text doesn't match with the message it will take a screenshot and fails the test

But this is working for your custom alerts not on system alerts..!!

this will help you if you need to read the message from alert

open $ calabash-ios console and

query like query("view:'UIAlertView'",:message)

add more....

Or You can use something like

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

For iOS 7 and above: following calabash code will work fine.

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

Works for me.

The link to the calabash-ios issue was buried in the comments.

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

In that issue, I provide an example of how to handle search for text with newlines.

Karl also suggests writing the step with multi-line strings ("pystrings")

Then I see an alert with text:
"""
Latitude:59
Longitude:17
"""
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top