| // Copyright 2018 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import "base/strings/sys_string_conversions.h" |
| #import "base/values.h" |
| #import "ios/chrome/browser/autofill/automation/automation_action.h" |
| #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" |
| #import "ios/chrome/test/earl_grey/chrome_test_case.h" |
| #import "ios/testing/earl_grey/earl_grey_test.h" |
| #import "net/test/embedded_test_server/embedded_test_server.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| const char kTestPageUrl[] = "/components/test/data/autofill/" |
| "credit_card_upload_form_address_and_cc.html"; |
| |
| // Tests each automation that can be performed, by performing them individually |
| // against a self-hosted webpage and verifying the action was performed through |
| // JS queries. |
| @interface AutofillAutomationActionTestCase : ChromeTestCase |
| @end |
| |
| @implementation AutofillAutomationActionTestCase |
| |
| - (void)setUp { |
| [super setUp]; |
| |
| NSString* bundlePath = [NSBundle bundleForClass:[self class]].resourcePath; |
| self.testServer->ServeFilesFromDirectory( |
| base::FilePath(base::SysNSStringToUTF8(bundlePath))); |
| XCTAssertTrue(self.testServer->Start()); |
| |
| [ChromeEarlGrey loadURL:self.testServer->GetURL(kTestPageUrl)]; |
| } |
| |
| // Tests the click action, by clicking a button that populates the web page, |
| // then using JS to assert that the web page has been populated as a result |
| // of the click. |
| - (void)testAutomationActionClick { |
| base::Value::Dict dict; |
| dict.Set("type", "click"); |
| dict.Set("selector", "//*[@id=\"fill_form\"]"); |
| AutomationAction* action = |
| [AutomationAction actionWithValueDict:std::move(dict)]; |
| [action execute]; |
| |
| base::Value result = [ChromeEarlGrey |
| evaluateJavaScript: |
| @"document.getElementsByName(\"name_address\")[0].value == \"John " |
| @"Smith\""]; |
| GREYAssertTrue(result.is_bool(), @"The output is not a boolean."); |
| GREYAssert(result.GetBool(), |
| @"Click automation action did not populate the name field."); |
| } |
| |
| // Tests the waitFor action, by using the click action to click a button that |
| // populates the name field after a few seconds, and using waitFor to verify |
| // this eventually happens. |
| - (void)testAutomationActionClickAndWaitFor { |
| base::Value::Dict clickDict; |
| clickDict.Set("type", "click"); |
| clickDict.Set("selector", "//*[@id=\"fill_form_delay\"]"); |
| AutomationAction* clickAction = |
| [AutomationAction actionWithValueDict:std::move(clickDict)]; |
| [clickAction execute]; |
| |
| base::Value::Dict waitForDict; |
| waitForDict.Set("type", "waitFor"); |
| base::Value::List assertions = base::Value::List(); |
| assertions.Append( |
| "return document.getElementsByName(\"name_address\")[0].value == \"Jane " |
| "Smith\";"); |
| waitForDict.Set("assertions", std::move(assertions)); |
| AutomationAction* waitForAction = |
| [AutomationAction actionWithValueDict:std::move(waitForDict)]; |
| [waitForAction execute]; |
| } |
| |
| - (void)testAutomationActionSelectDropdown { |
| base::Value::Dict selectDict; |
| selectDict.Set("type", "select"); |
| selectDict.Set("selector", "//*[@name=\"cc_month_exp\"]"); |
| selectDict.Set("index", 5); |
| AutomationAction* selectAction = |
| [AutomationAction actionWithValueDict:std::move(selectDict)]; |
| [selectAction execute]; |
| |
| base::Value result = [ChromeEarlGrey |
| evaluateJavaScript: |
| @"document.getElementsByName(\"cc_month_exp\")[0].value == \"6\""]; |
| GREYAssertTrue(result.is_bool(), @"The result is not a boolean"); |
| GREYAssert(result.GetBool(), |
| @"Select automation action did not change the dropdown."); |
| } |
| |
| @end |