Appium - Как установить Geo Location на устройстве iOS?

Мета: -

  • эмулятор iOS v10.3
  • Appium java-client v5.0.0 BETA8
  • Selenium v3.4.0

На самом деле я пытаюсь установить GeoLocation в iOS с помощью Appium XCUITest автоматизации. Я пробовал использовать код ниже, который отлично работает на устройстве Android, а исключение throw на 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);

Исключение:

org.openqa.selenium.WebDriverException: метод еще не реализован (ПРЕДУПРЕЖДЕНИЕ: сервер не предоставил никакой информации о стеке)

И когда я пытаюсь использовать JavascriptExecutor как:

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

Исключение:

org.openqa.selenium.UnsupportedCommandException: Неизвестная мобильная команда "setLocation". Только прокрутка, прокрутка, щепотка, doubleTap, twoFingerTap, touchAndHold, tap, dragFromToForDuration, selectPickerWheelValue, поддерживаются команды предупреждений. (ПРЕДУПРЕЖДЕНИЕ: сервер не предоставил никакой информации о стеке)

И когда я пытаюсь как:

import org.openqa.selenium.remote.DriverCommand;

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

Исключение:

org.openqa.selenium.WebDriverException: метод еще не реализован (ПРЕДУПРЕЖДЕНИЕ: сервер не предоставил никакой информации о стеке)

Есть ли способ установить GeoLocation на iOS с помощью appium?

Журнал 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\" ip \ ":\" 192.168.1.17 \ "\n},\n\" build \ ": {\n\" time \ ":\" 29 августа 2017 15: 40: 09\ "\n}\n},\n \" sessionId\ ": \" 10A97A93-D13A-4888-A536-0D62E0674A2B\ ",\n \" status\ ": 0\n}"

[debug] [XCUITest] WebDriverAgent работает на ip '192.168.1.17' [debug] [XCUITest] WebDriverAgent успешно запущен после 16121ms [debug] [BaseDriver] Событие "wdaSessionAttempted" зарегистрировано в 1504013035278 (18:53:55 GMT + 0530 (IST)) [debug] [XCUITest] Отправка createSession команда WDA [debug] [Прокси-сервер JSONWP] Проксирование [POST/session] для [POST http://localhost:8100/session] с телом: { "desiredCapabilities": { "BundleID": "com.example.apple-samplecode.UICatalog", "аргументы": [], "окружающая среда": {}, "shouldWaitForQuiescence": правда, "shouldUseTestManagerForVisibilityDetection" ложь "maxTypingFrequency": 120, "shouldUseSingletonTestManager": правда}} [debug] [JSONWP Proxy] Получил ответ со статусом 200: { "Значение": { "SESSIONID" : "43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C" , "возможность": { "устройство": "айфон", "browserName": "UICatalog", "sdkVersion": "10.3. 1", "CFBundleIdentifier": "com.example.apple-samplecode.UICatalog" }}, "SESSIONID" : "43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C" , "статус": 0} [debug] [BaseDriver] Событие 'wdaSessionStarted' зарегистрировано в 1504013038184 (18:53:58 GMT + 0530 (IST)) [debug] [XCUITest] Найдено данные WDA папка: '/Users/omprakash.mishra/Library/Developer/Xcode/DerivedData/WebDriverAgent-dikkwtrisltbeobjmfvpthwwekvs' [XCUITest] Настройка разрешений "555" для '/Users/omprakash.mishra/Library/Developer/Xcode/DerivedData/WebDriverAgent-dikkwtrisltbeobjmfvpthwwekvs/Logs/Test/Attachments' папка [debug] [XCUITest] Найденная папка данных WDA: '/Users/omprakash.mishra/Library/Developer/Xcode/DerivedData/WebDriverAgent-folfazwwukpzfkegdblpnfuwlvfn' [XCUITest] Настройка разрешений "555" для '/Users/omprakash.mishra/Library/Developer/Xcode/DerivedData/WebDriverAgent-folfazwwukpzfkegdblpnfuwlvfn/Logs/Test/Attachments' папка [debug] [BaseDriver] Событие "wdaPermsAdjusted" зарегистрировано в 1504013038192 (18:53:58 GMT + 0530 (IST)) [debug] [BaseDriver] Событие 'wdaStarted' зарегистрирован в 1504013038193 (18:53:58 GMT + 0530 (IST)) [debug] [XCUITest] Настройка начальной ориентации на "ПОРТРЕТ" [отладка] [JSONWP Прокси] Проксирование [POST/ориентация] на [POST http://localhost:8100/session/43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C/orientation]с телом: { "ориентация": "ПОРТРЕТ" } [debug] [JSONWP Proxy] Got ответ со статусом 200: { "Значение": {}, "SESSIONID" : "43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C" , "Статус": 0} [debug] [BaseDriver] Событие 'orientationSet' зарегистрировано в 1504013038453 (18:53:58 GMT + 0530 (IST)) [Appium] Создана новая сессия XCUITestDriver успешно, сеанс 6909c363-12a5-4a21-9298-c7f750ba7e09 добавлен в Список основных сессий [debug] [BaseDriver] Событие 'newSessionStarted' зарегистрирован в 1504013038456 (18:53:58 GMT + 0530 (IST)) [debug] [MJSONWP] Ответ на клиент с результатом driver.createSession(): { "WebStorageEnabled" ложь "locationContextEnabled" ложь "browserName": "," платформа ":" MAC "," javascriptEnabled ": правда," databaseEnabled "ложь" takesScreenshot ": правда," networkConnectionEnabled ": ложь," приложение ":" SRC/тест/ресурсы/исполнитель/UICatalog.app "," maxTypingFrequency ":" 120 "," newCommandTimeout ": 0," platformVersion ":" 10,3 "," automationName ":" XCUITest "," platformName ":" IOS "," UDID ":" 0A41ECE4-6D03-4FEA-A82A-858FDBA6620E "," DEVICENAME ":" iPhone 6 "} [HTTP] < - POST/wd/hub/session 200 46915 мс - 512 [HTTP] → GET /wd/hub/session/ 6909c363-12a5-4a21-9298-c7f750ba7e09 {} [debug] [MJSONWP] Вызов AppiumDriver.getSession() с помощью args: [" 6909c363-12a5-4a21-9298-c7f750ba7e09 "] [debug] [XCUITest] Выполнение команда 'getSession' [debug] [Прокси JSONWP] Проксирование [GET/] на [GET http://localhost:8100/session/43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C]без тела [debug] [JSONWP Proxy] Получил ответ со статусом 200: "{\n \ "value \ ": {\n\" sessionId \": \ "43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C \ ",\n\" возможности \": {\n \ "device \ ":\" iphone \ ",\n\" browserName \ ":\" UICatalog \",\n
\ "sdkVersion \ ":\" 10.3.1 \ ",\n\" CFBundleIdentifier \": \ "com.example.apple-samplecode.UICatalog \" \n}\n},\n \ "sessionId \ ":\" 43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C \",\n \ "status \" : 0\n} "[XCUITest] Объединение WDA с крышками Appium для ответ отклика на сеанс [debug] [MJSONWP] Отвечая на запрос клиента Результат driver.getSession(): {" UDID": "," приложение ":" SRC/тест/ресурсы/исполнитель/UICatalog.app "," maxTypingFrequency ": 120," newCommandTimeout ": 0," platformVersion ":" 10,3 "," automationName ":" XCUITest "," platformName ":" IOS "," DEVICENAME ":" iPhone 6 "," device ":" iphone "," browserName ":" UICatalog "," sdkVersion ":" 10.3.1 "," CFBundleIdentifier ":" com.example.apple-samplecode.UICatalog "} [HTTP] < - GET/wd/hub/session/6909c363-12a5-4a21-9298-c7f750ba7e09 200 110 мс - 406 [HTTP] → GET /wd/hub/session/ 6909c363-12a5-4a21-9298-c7f750ba7e09 {} [debug] [MJSONWP] Вызов AppiumDriver.getSession() с помощью args: [" 6909c363-12a5-4a21-9298-c7f750ba7e09 "] [debug] [XCUITest] Выполнение команда 'getSession' [debug] [Прокси JSONWP] Проксирование [GET/] на [GET http://localhost:8100/session/43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C]без тела [debug] [JSONWP Proxy] Получил ответ со статусом 200: "{\n \ "value \ ": {\n\" sessionId \": \ "43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C \ ",\n\" возможности \": {\n \ "device \ ":\" iphone \ ",\n\" browserName \ ":\" UICatalog \",\n
\ "sdkVersion \ ":\" 10.3.1 \ ",\n\" CFBundleIdentifier \": \ "com.example.apple-samplecode.UICatalog \" \n}\n},\n \ "sessionId \ ":\" 43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C \",\n \ "status \" : 0\n} "[XCUITest] Объединение WDA с крышками Appium для ответ отклика на сеанс [debug] [MJSONWP] Отвечая на запрос клиента Результат driver.getSession(): {" UDID": "," приложение ":" SRC/тест/ресурсы/исполнитель/UICatalog.app "," maxTypingFrequency ": 120," newCommandTimeout ": 0," platformVersion ":" 10,3 "," automationName ":" XCUITest "," platformName ":" IOS "," DEVICENAME ":" iPhone 6 "," device ":" iphone "," browserName ":" UICatalog "," sdkVersion ":" 10.3.1 "," CFBundleIdentifier ":" com.example.apple-samplecode.UICatalog "} [HTTP] < - GET/wd/hub/session/6909c363-12a5-4a21-9298-c7f750ba7e09 200 103 мс - 406 [HTTP] → POST /WD/ концентратор/сессия/6909c363-12a5-4a21-9298-c7f750ba7e09/место {" Место ": {" высота ": 0," широта ": 20,672267," hCode ": 1751403001," класс ":" org.openqa.selenium.html5.Location "," долгота ": 83,1649}} [debug] [MJSONWP] Вызов AppiumDriver.setGeoLocation() с помощью args: [{" Высота ": 0," широта ": 20,672267," hCode ": 1751403001," класс ":" org.openqa.selenium.html5.Location "," долгота ": 83,1649}," 6909c363-12a5-4a21- 9298-c7f750ba7e09 "] [debug] [XCUITest] Выполнение команды 'setGeoLocation' [HTTP] < - POST /wd/hub/session/ 6909c363-12a5-4a21-9298-c7f750ba7e09/location 501 30 ms - 122 org.openqa.selenium.WebDriverException: метод пока не установлен (ПРЕДУПРЕЖДЕНИЕ: сервер не предоставил ни одной stacktrace информация) Продолжительность или таймаут команды: 58 миллисекунд. Информация о сборке: версия: '3.4.0', версия: 'unknown', время: 'unknown' Системная информация: host: 'Abhays-MacBook-Air.local', ip: 'fe80: 0: 0: 0: 4fc: aa3c: d673: 369e% en0', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.12.5 ', java.version:' 1.8.0_131 'Драйвер информация: Возможности io.appium.java_client.ios.IOSDriver [{Приложение = SRC/тест/ресурсы/исполнитель/UICatalog.app, networkConnectionEnabled = false, databaseEnabled = false, deviceName = iPhone 6, платформа = MAC, maxTypingFrequency = 120, newCommandTimeout = 0, platformVersion = 10.3, webStorageEnabled = false, locationContextEnabled = false, automationName = XCUITest, browserName =, принимаетScreenshot = true, javascriptEnabled = true, platformName = iOS, udid = 0A41ECE4-6D03-4FEA-A82A-858FDBA6620E}] Идентификатор сессии: 6909c363-12a5-4a21-9298-c7f750ba7e09 при sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод)   в sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)   в sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)   в java.lang.reflect.Constructor.newInstance(Constructor.java:423)   в org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:215)   в org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:167)   в org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:671)   в io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:42)   в io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)   в io.appium.java_client.ios.IOSDriver.execute(IOSDriver.java:1) в io.appium.java_client.AppiumExecutionMethod.execute(AppiumExecutionMethod.java:46)   в org.openqa.selenium.remote.html5.RemoteLocationContext.setLocation(RemoteLocationContext.java:50)   в io.appium.java_client.AppiumDriver.setLocation(AppiumDriver.java:400)   at org.openqa.selenium.html5.LocationContext $setLocation.call(Неизвестно Источник) в org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)   в org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)   в org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:122)   в executor.com.bqurious.keyword.mobile.ios.BqIosSetLocationTest.setLocation(BqIosSetLocationTest.groovy: 72)   at sun.reflect.NativeMethodAccessorImpl.invoke0 (Нативный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)   в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java: 43)   в java.lang.reflect.Method.invoke(Method.java:498) в org.junit.runners.model.FrameworkMethod $1.runReflectiveCall(FrameworkMethod.java:50)   в org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)   в org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)   в org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)   на org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) в org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)   в org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)   на org.junit.runners.ParentRunner $3.run(ParentRunner.java:290) в org.junit.runners.ParentRunner $1.schedule(ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) в org.junit.runners.ParentRunner.access $000 (ParentRunner.java:58) в org.junit.runners.ParentRunner $2.оценка (ParentRunner.java:268) в org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)   в org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)   на org.junit.runners.ParentRunner.run(ParentRunner.java:363) в org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)   в org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)   в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)   в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)   в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)   в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) [HTTP] → DELETE/wd/hub/session/6909c363-12a5-4a21-9298-c7f750ba7e09 {} [debug] [MJSONWP] Вызов AppiumDriver.deleteSession() с помощью args: [" 6909c363-12a5-4a21-9298-c7f750ba7e09 "] [debug] [BaseDriver] Событие 'quitSessionRequested' зарегистрирован в 1504013038955 (18:53:58 GMT + 0530 (IST)) [debug] [Прокси JSONWP] Проксирование [DELETE /session/ 6909c363-12a5-4a21-9298-c7f750ba7e09] на [УДАЛИТЬ http://localhost:8100/session/43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C]без тела [debug] [JSONWP Proxy] Получил ответ со статусом 200: "{\n \ "value \" : {\n\n},\n\ "sessionId \" : \ "28E97E0B-DF47-4325-8991-A28B77134EDB \ ",\n\" status \": 0\n} "[XCUITest] Выключение подпроцессов [XCUITest] Выключение Процесс xcodebuild (pid 37304) [XCUITest] xcodebuild завершен с кодом 'null' и сигнал 'SIGTERM' [debug] [XCUITest] Найдено данные, полученные WDA папка: '/Users/omprakash.mishra/Library/Developer/Xcode/DerivedData/WebDriverAgent-dikkwtrisltbeobjmfvpthwwekvs' [XCUITest] Установка разрешений" 755 "для '/Users/omprakash.mishra/Library/Developer/Xcode/DerivedData/WebDriverAgent-dikkwtrisltbeobjmfvpthwwekvs/Logs/Test/Attachments' папка [debug] [XCUITest] Найденная папка данных WDA: '/Users/omprakash.mishra/Library/Developer/Xcode/DerivedData/WebDriverAgent-folfazwwukpzfkegdblpnfuwlvfn' [XCUITest] Установка разрешений" 755" для '/Users/omprakash.mishra/Library/Developer/Xcode/DerivedData/WebDriverAgent-folfazwwukpzfkegdblpnfuwlvfn/Logs/Test/Attachments' folder [debug] [XCUITest] Не очистка файлов журнала. использование clearSystemFiles возможность включения. [debug] [iOSLog] Остановка iOS log capture [Appium] Удаление сеанса 6909c363-12a5-4a21-9298-c7f750ba7e09 из нашего списка мастер-сессий [debug] [BaseDriver] Событие 'quitSessionFinished', зарегистрированное в 1504013039408 (18:53:59 GMT + 0530 (IST)) [debug] [MJSONWP] Получено response: null [debug] [MJSONWP] Но удаление сеанса, поэтому не return [debug] [MJSONWP] Отвечая на вопрос клиента с driver.deleteSession() result: null [HTTP] < - DELETE /wd/hub/session/ 6909c363-12a5-4a21-9298-c7f750ba7e09 200 461 мс - 76

Ответы

Ответ 1

Этот 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 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 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) ¬\n" +
                        "        (menu bar 1) (menu bar item topMenu) (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 length > 1 then set r to (items 2 through (mList length) of mList)\n" +
                        "\n" +
                        "    -- either actually click the menu item, or recurse again\n" +
                        "    tell application \"System Events\"\n" +
                        "        if mList length is 1 then\n" +
                        "            click parentObject menu item f\n" +
                        "        else\n" +
                        "            my menu_click_recurse(r, (parentObject (menu item f) (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";
}

Ответ 2

Кажется, вам нужен AppiumDriver. Согласно этот комментарий.

Ответ 3

Вы можете использовать метод setLocation для установки широты и долготы в эмуляторе Android или имитаторе iOS:

import org.openqa.selenium.html5.Location;

Местоположение loc = новое Местоположение (20.0, 12.5, 1000);//широта, долгота, высота driver.setLocation(LOC);

Ответ 4

Я согласен с решением использовать apple script для настройки пользовательской геолокации для симулятора iOS, потому что Appium не поддерживает такой метод для iOS (Apple не предоставляет API для платформы XCTest для имитации местоположения GPS)

Apple script:

#!/usr/bin/env bash

osascript -e 'tell application "System Events"
    tell process "Simulator"
        set frontmost to true
        click menu item "Custom Location…" of menu of menu item "Location" of menu "Debug" of menu bar 1
        set popup to window "Custom Location"
        set value of text field 1 of popup to (system attribute "Latitude")
        set value of text field 2 of popup to (system attribute "Longitude")
        click button "OK" of popup
    end tell
end tell'

Я использую python, поэтому вот мое решение для Android и iOS:

    def set_geo_location(self, latitude, longitude, altitude):

    logging.info("set geo location")
    try:
        # Currently Apple does not provide any API for XCTest framework to simulate GPS location
        self.driver.set_location(latitude=latitude, longitude=longitude, altitude=altitude)
    except WebDriverException:
        # this will launch Apple Script to automatically set custom GPS location on iOS simulator
        subprocess.call([os.path.join(PROJECT_ROOT, "set_geolocation_for_iOS.sh")],
                        env={"Latitude": latitude, "Longitude": longitude})  # bash cli command for iOS simulator
    sleep(2)

И я передаю кабели GPS в этот метод:

set_geo_location("-77.85", "166.66", "10")