2013-05-21 8 views
4

Я не могу получить автоматизацию, работающую с Appium и браузером Safari для мобильных устройств на эмуляторе iOS. В моем Java-проекте Safari запустится, но браузер даже не перейдет к указанному веб-сайту. Может ли кто-нибудь сказать мне, что я делаю неправильно с моим кодом?Appium и iOS Mobile Safari автоматизации, можно ли это сделать?

1) Запустите приложение Appium на моей машине OSX. Он настроен со следующими параметрами:

IP Address: 127.0.0.1 
Port: 4723 
Force Device: Checked - iPhone 
User Mobile Safari: Checked 

(Примечание:. Нет сообщений прокручивать на экране журнала приложений Appium при запуске моего проекта Ранее я получил жалобы о пропавшей 6.0 библиотеке IOS, но когда я продублировал 6,1 IOS библиотека, а затем переименован в каталог до 6,0, сообщения ушла.)

2) Запустите Eclipse и открытый проект Appium

3) щелкните правой кнопкой мыши на тестовый код и нажмите RunAs JUnit

4) iPhone emulator запускает - iPhone iOS 6.1

5) Mobile Safari запускает ... и затем никуда не отправляется (должен идти cnn.com). У меня нет ошибок.

Могут ли проекты Appium Java фактически использоваться для автоматизации Mobile-Safari? Я не вижу примеров автоматизации Safari в повторном образце кода Appium.

Что дает?

Спасибо,

Ларри

------------------ Java код ниже -------------- --------------------------

Eclipse Juno используется для запуска моего проекта Java/Appium. Здесь намного упрощена листинг кода проекта Java JUnit (который, когда вносятся соответствующие изменения, и используются с iWebDriver и устаревшей iPhoneDriver(), отлично работает):

import org.junit.Before; 
import org.junit.After; 
import org.junit.Test; 
import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.remote.DesiredCapabilities; 
import org.openqa.selenium.remote.RemoteWebDriver; 

public class AppiumiPhoneWebDriverDemo { 

    private String baseUrl; 
    private WebDriver driver; 

    @Before 
    public void setup() throws Exception 
    { 

     WebDriver driver; 
     DesiredCapabilities cap = new DesiredCapabilities(); 
     //cap.setCapability("", ""); 
     //cap.setCapability("browsername", ""); 
     //cap.setCapability("os", "iOS 6.1"); 
     cap.setCapability("device", "iPhone Simulator"); 
     cap.setCapability("app", "safari"); 

     driver = new RemoteWebDriver(new URL("http://localhost:4723/wd/hub"), cap); 

    baseUrl = "http://www.cnn.com"; 

    } 

    @After 
    public void tearDown() throws Exception 
    { 

    driver.quit(); 

    } 


    @Test 
    public void test_searchWorks() throws Exception 
    { 
     this.driver.get(baseUrl); 

     driver.quit(); 
    } 

    } 

ответ

2

Вы можете определенно сделать это.

Смотреть этот код

"use strict"; 

require("./helpers/setup"); 

var wd = require("wd"), 
    _ = require('underscore'), 
    serverConfigs = require('./helpers/appium-servers'); 

describe("ios safari", function() { 
    this.timeout(300000); 
    var driver; 
    var allPassed = true; 

    before(function() { 
    var serverConfig = process.env.SAUCE ? 
     serverConfigs.sauce : serverConfigs.local; 
    driver = wd.promiseChainRemote(serverConfig); 
    require("./helpers/logging").configure(driver); 

    var desired = _.clone(require("./helpers/caps").ios81); 
    desired.browserName = 'safari'; 
    if (process.env.SAUCE) { 
     desired.name = 'ios - safari'; 
     desired.tags = ['sample']; 
    } 
    return driver.init(desired); 
    }); 

    after(function() { 
    return driver 
     .quit() 
     .finally(function() { 
     if (process.env.SAUCE) { 
      return driver.sauceJobStatus(allPassed); 
     } 
     }); 
    }); 

    afterEach(function() { 
    allPassed = allPassed && this.currentTest.state === 'passed'; 
    }); 


    it("should get the url", function() { 
    return driver 
     .get('https://www.google.com') 
     .sleep(1000) 
     .waitForElementByName('q', 5000) 
     .sendKeys('sauce labs') 
     .sendKeys(wd.SPECIAL_KEYS.Return) 
     .sleep(1000) 
     .title().should.eventually.include('sauce labs'); 
    }); 

    it("should delete cookie passing domain and path", function() { 
    var complexCookieDelete = function(name, path, domain) { 
     return function() { 
     path = path || '|'; 
     return driver.setCookie({name: name, value: '', path: path, 
      domain: domain, expiry: 0});   
     }; 
    }; 

    return driver 
     .get('http://en.wikipedia.org') 
     .waitForElementByCss('.mediawiki', 5000) 
     .allCookies() // 'GeoIP' cookie is there 
     .deleteCookie('GeoIP') 
     .allCookies() // 'GeoIP' is still there, because it is set on 
        // the .wikipedia.org domain 
     .then(complexCookieDelete('GeoIP', '/', '.wikipedia.org')) 
     .allCookies() // now 'GeoIP' cookie is gone 
     .sleep(1000); 
    }); 

}); 
1

Почему вы определяете второй WebDriver в методе нАлАдкА? Удалите это второе определение, чтобы настроить драйвер члена класса.

0
DesiredCapabilities cap = new DesiredCapabilities(); 
     //cap.setCapability("", ""); 
     //cap.setCapability("browsername", ""); 
     //cap.setCapability("os", "iOS 6.1"); 
     cap.setCapability("device", "iPhone Simulator"); 
     cap.setCapability("app", "safari"); 

должен быть

DesiredCapabilities cap = new DesiredCapabilities(); 
     cap.setCapability("deviceName", "iPhone Simulator"); 
     cap.setCapability("browsername", "safari"); 
     cap.setCapability("platformVersion", "7.1"); 
     cap.setCapability("platformName", "iOS"); 

Это работает для меня. надеюсь, что это исправить вашу проблему. Удачи.

0

Предполагая, что вы используете Java на Mac, вот то, что работает для меня, включая код для запуска непосредственно Appium Service, то драйвер для подключения к нему:

package baseTest; 

import com.groupon.tests.mainapp.pages.*; 
import io.appium.java_client.ios.IOSDriver; 
import io.appium.java_client.service.local.AppiumDriverLocalService; 
import io.appium.java_client.service.local.AppiumServiceBuilder; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.remote.DesiredCapabilities; 
import org.testng.annotations.AfterClass; 
import org.testng.annotations.BeforeClass; 
import org.testng.annotations.BeforeMethod; 

import java.io.File; 
import java.io.IOException; 
import java.net.URL; 


public class AppiumSafariBaseUITest { 

private WebDriver wd; 

protected WebDriver getDriver(){ 
    return wd; 
} 

String nodePath = "/Applications/Appium.app/Contents/Resources/node/bin/node"; 
String appiumJSPath = "/usr/local/lib/node_modules/appium/build/lib/main.js"; 

AppiumDriverLocalService service; 
String service_url; 

private void startAppiumServer() throws IOException { 
    service = AppiumDriverLocalService.buildService(new AppiumServiceBuilder() 
        .usingPort(4890) 
        .usingDriverExecutable(new File(nodePath)) 
        .withAppiumJS(new File(appiumJSPath)) 
    ); 
    service.start(); 
} 

@BeforeClass(alwaysRun = true) 
public void setUpAppiumDriver() throws IOException { 

    startAppiumServer(); 

    service_url = service.getUrl().toString(); 

    DesiredCapabilities capabilities = new DesiredCapabilities(); 
    capabilities.setCapability("appium-version", "1.0"); 
    capabilities.setCapability("platformName", "iOS"); 
    capabilities.setCapability("platformVersion", "9.3"); 
    capabilities.setCapability("deviceName", "iPhone 5s"); 
    capabilities.setCapability("newCommandTimeout", 600); 
    capabilities.setCapability("bundleId", "com.apple.mobilesafari"); 
    capabilities.setCapability("useLocationServices", false); 

    wd = new IOSDriver(new URL(service_url), capabilities); 
} 

@BeforeMethod(alwaysRun = true) 
public void beforeMethod(){ 
    if(!service.isRunning()) 
    { 
     service.start(); 
    } 
} 

@AfterClass(alwaysRun = true) 
public void killSimulatorAndAppium(){ 
    service.stop(); 
} 
}