当前位置: 首页 > 知识库问答 >
问题:

Appium-如何在iOS设备上设置地理位置?

耿锦
2023-03-14

Meta:-

  • IOS仿真器设备v10.3
  • Appium java-client V5.0.0 beta8
  • 硒v3.4.0

实际上,我试图在IOS设备中使用AppiumXCUITEST自动化设置Geolocation。我尝试了以下代码,它在Android设备上运行良好,而在IOS上抛出异常:

import org.openqa.selenium.html5.Location;

AppiumServiceBuilder builder = new AppiumServiceBuilder().usingAnyFreePort().withAppiumJS("path/to/appium/main.js");

DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("automationName", "XCUITest");
IOSDriver driver= new IOSDriver(builder, capabilities);

//Here this code working fine with AndroidDriver
Location location = new Location(latitude, longitude, altitude);    
driver.setLocation(location);

例外情况:

WebDriverException:方法尚未实现(警告:服务器未提供任何stacktrace信息)

当我尝试使用JavascriptExecutor作为:

Map<String, String> args = new HashMap<String, String>();
args.put("address", "Address");
((JavascriptExecutor)webDriver).executeScript("mobile:setLocation", args);

UnsupportedCommandException:未知的移动命令“SetLocation”。只支持scroll、swipe、pinch、doubleTap、twoFingerTap、touchAndHold、tap、dragFromToForDuration、selectPickerWheelValue、alert命令。(警告:服务器未提供任何stacktrace信息)

当我试着:

import org.openqa.selenium.remote.DriverCommand;

Map<String, String> args = new HashMap<String, String>();
args.put("location", "Address");
driver.execute(DriverCommand.SET_LOCATION, args);

例外情况:

Appium日志:

[debug][JSONWP Proxy]得到的响应状态为200:“{\n\”value\“:{\n\”state\“:\”success\“,\n\”os\“:{\n\”name\“:\”ios\“,\n\”version\“:\”10.3.1\“\n},\n\”ios\“:{\n\”simulatorversion\“:\”10.3.1\“,\n\”ios\“:{\n\”simulatorversion\“:”192.168.1.17\“\n},\n\”build\“:{\n\”time\“:”A-4888-A536-0D62E0674A2B\“,\n\”状态\“:0\n}”

共有1个答案

轩辕庆
2023-03-14

这个AppleScript会工作的。

public static void setLocation(Location loc) {
    try {
        String[] cmd = {"osascript", "-e",
                "on menu_click(mList)\n" +
                        "    local appName, topMenu, r\n" +
                        "\n" +
                        "    -- Validate our input\n" +
                        "    if mList's length < 3 then error \"Menu list is not long enough\"\n" +
                        "\n" +
                        "    -- Set these variables for clarity and brevity later on\n" +
                        "    set {appName, topMenu} to (items 1 through 2 of mList)\n" +
                        "    set r to (items 3 through (mList's length) of mList)\n" +
                        "\n" +
                        "    -- This overly-long line calls the menu_recurse function with\n" +
                        "    -- two arguments: r, and a reference to the top-level menu\n" +
                        "    tell application \"System Events\" to my menu_click_recurse(r, ((process appName)'s ¬\n" +
                        "        (menu bar 1)'s (menu bar item topMenu)'s (menu topMenu)))\n" +
                        "end menu_click\n" +
                        "\n" +
                        "on menu_click_recurse(mList, parentObject)\n" +
                        "    local f, r\n" +
                        "\n" +
                        "    -- `f` = first item, `r` = rest of items\n" +
                        "    set f to item 1 of mList\n" +
                        "    if mList's length > 1 then set r to (items 2 through (mList's length) of mList)\n" +
                        "\n" +
                        "    -- either actually click the menu item, or recurse again\n" +
                        "    tell application \"System Events\"\n" +
                        "        if mList's length is 1 then\n" +
                        "            click parentObject's menu item f\n" +
                        "        else\n" +
                        "            my menu_click_recurse(r, (parentObject's (menu item f)'s (menu f)))\n" +
                        "        end if\n" +
                        "    end tell\n" +
                        "end menu_click_recurse\n" +
                        "\n" +
                        "application \""+simulatorAppName()+"\" activate    \n" +
                        "delay 0.2\n" +
                        "menu_click({\""+simulatorAppName()+"\",\"Debug\", \"Location\", \"None\"})\n" +
                        "\n" +
                        "delay 0.2\n" +
                        "menu_click({\""+simulatorAppName()+"\",\"Debug\", \"Location\", \"Custom Location…\"})\n" +
                        "\n" +
                        "delay 0.2\n" +
                        "tell application \"System Events\"\n" +
                        "    tell process \""+simulatorAppName()+"\"\n" +
                        "        set value of text field 1 of window \"Custom Location\" to \""+loc.getLatitude()+"\"\n" +
                        "        set value of text field 2 of window \"Custom Location\" to \""+loc.getLongitude()+"\"\n" +
                        "        click UI Element \"OK\" of window \"Custom Location\"\n" +
                        "    end tell\n" +
                        "end tell"
        };
        Process process = Runtime.getRuntime().exec(cmd);
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(process.getErrorStream()));
        String lsString;
        while ((lsString = bufferedReader.readLine()) != null) {
            System.out.println(lsString);
        }
        try{Thread.sleep(10000);}catch (Exception e1){}
    } catch (Exception e) {}
}

public static String simulatorAppName() {
    return "Simulator";
}
 类似资料:
  • 获取设备的 Loaction 信息 参数说明 字段 类型 必须? 说明 deviceId String 是 设备Id completion 是 结果回调 接口定义 Swift: RokidMobileSDK.device.getLocation(deviceId: String, completion: @escaping (_ error: RKError?, _ location: Locat

  • 获取设备地址位置 接口说明 获取设备的loaction信息 参数说明 字段 类型 必须? 说明 deviceId String 是 设备ID 示例代码 RKDeviceLocation location = RokidMobileSDK.device.getLocation(deviceId); RKDeviceLoaction数据格式: { //邮政编码 "postalCod

  • 我是一名android开发人员,已经使用它开发上下文感知应用程序有一段时间了。位置是上下文感知的重要内容之一,而位置的准确性是非常重要的。 我知道怎么用LocationManager从GPS上得到位置...我知道如何在Android上使用谷歌地图开发应用程序...以及如何在地图上显示用户…但是我的朋友们发现,当他们去外国参加会议时,他们在LocationManager上的位置与谷歌地图相比非常不准

  • 我想使用appium在特定的xpath上执行向左滑动。不管怎样,我能做到吗?

  • 我的团队面临着在Ios设备上运行测试的问题,他们运行速度非常慢,每个设备大约需要19分钟,在一些Ios为13的设备上,应用程序没有打开。在IOS 13上安装了应用程序,但未安装WDA,且应用程序未打开。 在本地,我们有Xcode 11.1、node 11.6.0、appium 1.17.1,所有这些都可以在本地环境中快速、良好地工作。仅供参考,Android的完美运行需要7分钟,设备场才能运行整个

  • 我正在评估我的iOS自动化测试应用程序。作为其中的一部分,当我选择我的设备目标作为iPhone模拟器时,我能够成功地执行appium元素检查器。但当我以实际设备为目标时,我无法调用元素检查器。 我已经用开发配置文件签署了我的应用程序,并且我能够从Xcode 5安装和运行我的应用程序。所以我的应用程序设置看起来不错,因为我可以运行我的应用程序。 然后我在Appium中配置了所有细节。应用程序GUI,