문제

I am using a hybrid app and writing tests using Appium + Selenium Webdriver in Ruby.

I start my test with some textbox editing + click a button to open the UIWebview (so far everything works). The problem is when the UIWebview is opened - I cannot access it (it is immediately closed when I'm trying to click a html element (I am using Appium inspector to find elements and to record my Ruby test). I understand that I have to switch to the UIWebview (as I found here), but I cannot make it to work.

Code example:

require 'rubygems'
require 'selenium-webdriver'
capabilities = {
    'browserName' => 'iOS',
    'platform' => 'Mac',
    'version' => '7.1',
    'device' => 'iPhone Retina (4-inch)',
    'app' => '/Users/{my user here}/Library/Developer/Xcode/DerivedData/{path here}/Build/Products/Debug-iphonesimulator/SDK.app'
}

server_url = "http://127.0.0.1:4723/wd/hub"

@wd = Selenium::WebDriver.for(:remote, :desired_capabilities => capabilities, :url => server_url)
# ...
# Do all kind of native actions here 
# ...

@wd.find_element(:name, "showWebviewButton").click
@wd.manage.timeouts.implicit_wait = 30 # seconds
# ???
# How do I switch to my UIWebview here??? 
# (cannot access html elements here with @wd.find_element(:name, "htmlElement"))
# ???

@wd.quit

EDIT: Using Appium inspector I found that my UIWebview is "window(1) ", so I tried:

@wd.switch_to.window(1)

This gives me the error:

A request to switch to a different window could not be satisfied because the window could not be found

(The error is thrown before the UIWebview is loaded)

도움이 되었습니까?

해결책 4

The only solution that finally worked for me (using Appium 1.2) is (taken from here, written in node.js)

 // javascript
// assuming we have an initialized `driver` object for an app
driver
    .contexts().then(function (contexts) { // get list of available views. Returns array: ["NATIVE_APP","WEBVIEW_1"]
        return driver.context(contexts[1]); // choose the webview context
    })

    // do some web testing
    .elementsByCss('.green_button').click()

    .context('NATIVE_APP') // leave webview context

    // do more native stuff here if we want

    .quit() // stop webdrivage

In the above link you could find the solution written in other languages.

다른 팁

It seems , you are switching to WebView before it loads. Please pause the script for some time and then switch to the WebView after it appears.

I have tried the following in java and worked fine for me, you may need to find the ruby version of the same.

 driver.switchTo().window("WEBVIEW");

try this

@wd.switch_to.window("WEBVIEW")  // i am not sure about the syntax

You need to access the element as shown below

findElement(By.xpath("//input[@name='firstName']"))

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top