簡體   English   中英

Appium - 如何在iOS設備上設置地理位置?

[英]Appium - How to set Geo Location on iOS Device?

Meta: -

  • iOS模擬器設備v10.3
  • Appium java-client v5.0.0 BETA8
  • Selenium v​​3.4.0

實際上我正在嘗試使用Appium XCUITest自動化在iOS設備中設置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);

例外:

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”。 只有滾動,滑動,捏合,雙擊,兩個手指點擊,觸摸和保持,點擊,拖動來自動態,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:方法尚未實現(警告:服務器未提供任何堆棧跟蹤信息)

無論如何使用appium在iOS上設置GeoLocation

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 \\“:\\”2017年8月29日15:40: 09 \\“\\ n} \\ n},\\ n \\”sessionId \\“:\\”10A97A93-D13A-4888-A536-0D62E0674A2B \\“,\\ n \\”狀態\\“:0 \\ n}”

[debug] [XCUITest] WebDriverAgent在ip上運行'192.168.1.17'[調試] [XCUITest] WebDriverAgent在16121ms后成功啟動[debug] [BaseDriver]事件'wdaSessionAttempted'登錄於1504013035278(格林尼治標准時間18:53:55 + 0530(IST) ))[debug] [XCUITest]將createSession命令發送到WDA [debug] [JSONWP Proxy]將[POST / session]代理到[POST http:// localhost:8100 / session] with body:{“desiredCapabilities”:{“bundleId “:” com.example.apple-samplecode.UICatalog”, “參數”:[], “環境”:{}, “shouldWaitForQuiescence”:真 “shouldUseTestManagerForVisibilityDetection”:假 “maxTypingFrequency”:120, “shouldUseSingletonTestManager”: true}} [debug] [JSONWP Proxy]得到狀態為200的響應:{“value”:{“sessionId”:“43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C”,“capabilities”:{“device”:“iphone” “browserName”: “UICatalog”, “sdkVersion”: “10.3.1”, “CFBundleIdentifier”: “com.example.apple-samplecode.UICatalog”}}, “的sessionId”:“43710C7E-2FDE-4A35-A2E0- 4D309EE2CE9C“,”status“:0} [debug] [BaseDriver]事件'wdaSessio nStarted”記錄在1504013038184(18時53分58秒GMT + 0530(IST))[調試] [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' 文件夾[調試] [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(IST))[調試] [BaseDriver]事件'wdaStarted'記錄於1504013038193(格林威治標准時間18:53:58) +0530(IST))[debug] [XCUITest]將初始方向設置為'PORTRAIT'[debug] [JSONWP Proxy]代理 [POST / orientation]到[POST http:// localhost:8100 / session / 43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C / orientation] with body:{“orientation”:“PORTRAIT”} [debug] [JSONWP Proxy] Got狀態為200的響應:{“value”:{},“sessionId”:“43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C”,“status”:0} [debug] [BaseDriver]事件'orientationSet'記錄於1504013038453(18 :格林威治標准時間53:58(IST))[Appium]新的XCUITestDriver會話成功創建,會話6909c363-12a5-4a21-9298-c7f750ba7e09添加到主會話列表[debug] [BaseDriver]事件'newSessionStarted'記錄於1504013038456(18 :53:58 GMT + 0530(IST))[debug] [MJSONWP]使用driver.createSession()結果響應客戶端:{“webStorageEnabled”:false,“locationContextEnabled”:false,“browserName”:“”,“platform “:” MAC “ ”javascriptEnabled“:真 ”databaseEnabled“:假 ”takesScreenshot“:真 ”networkConnectionEnabled“:假, ”應用程序“: ”SRC /測試/資源/執行/ UICatalog.app“,” maxTypingFrequency “:” 120" , “newCommandTimeout”:0 “platformVersion”: “10.3”,“自動 mationName“:”XCUITest“,”platformName“:”iOS“,”udid“:”0A41ECE4-6D03-4FEA-A82A-858FDBA6620E“,”deviceName“:”iPhone 6“} [HTTP] < - POST / wd / hub / session 200 46915 ms - 512 [HTTP] - > GET / wd / hub / session / 6909c363-12a5-4a21-9298-c7f750ba7e09 {} [debug] [MJSONWP]用args調用AppiumDriver.getSession():[“ 6909c363-12a5-4a21-9298-c7f750ba7e09“] [debug] [XCUITest]執行命令'getSession'[debug] [JSONWP Proxy]將[GET /]代理為[GET http:// localhost:8100 / session / 43710C7E-2FDE沒有主體[ -4A35-A2E0-4D309EE2CE9C] [調試] [JSONWP代理]獲得狀態200的響應:“{\\ n \\”值\\“:{\\ n \\”sessionId \\“:\\”43710C7E-2FDE-4A35- A2E0-4D309EE2CE9C \\“,\\ n \\”capabilities \\“:{\\ 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 \\“狀態\\”:0 \\ n}“[XCUITest]合並用於會話詳細信息響應的Appium上限的WDA上限[debug] [MJSONWP]響應客戶端driver.getSession()result:{“udid”:“”,“app”:“src / test / resources / executor / 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 ms - 406 [HTTP ] - > GET / wd / hub / session / 6909c363-12a5-4a21-9298-c7f750ba7e09 {} [debug] [MJSONWP]用args調用AppiumDriver.getSession():[“6909c363-12a5-4a21-9298-c7f750ba7e09” ] [debug] [XCUITest]執行命令'getSession'[debug] [JSONWP Proxy ] [GET /]代表[GET http:// localhost:8100 / session / 43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C]沒有正文[debug] [JSONWP代理]得到狀態為200的響應:“{\\ n \\ “value \\”:{\\ n \\“sessionId \\”:\\“43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C \\”,\\ n \\“capabilities \\”:{\\ 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 \\“狀態\\”:0 \\ n}“[XCUITest]合並用於會話詳細信息響應的Appium上限的WDA上限[debug] [MJSONWP]響應客戶端driver.getSession()result:{“udid”:“”,“app”:“src / test / resources / executor / 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 ms - 406 [HTTP ] - > POST / wd / hub / session / 6909c363-12a5-4a21-9298-c7f750ba7e09 / location {“location”:{“altitude”:0,“latitude”:20.672267,“hCode”:1751403001,“class” :“org.openqa.selenium.html5.Location”,“經度”:83.1649}} [debug] [MJSONWP]調用AppiumDri ver.setGeoLocation()with args:[{“altitude”:0,“latitude”:20.672267,“hCode”:1751403001,“class”:“org.openqa.selenium.html5.Location”,“longitude”: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:方法尚未實現(警告:服務器未提供任何堆棧跟蹤信息)命令持續時間或超時:58毫秒構建信息:版本:'3.4.0',修訂版: '未知',時間:'未知'系統信息:主持人:'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功能[{app = src / test / resources / executor / UICatalog.app,networkConnectionEnabled = false,databaseEnabled = false,deviceName = iPhone 6,platform = MAC,maxTypingFrequency = 120,newC ommandTimeout = 0,platformVersion = 10.3,webStorageEnabled = false,locationContextEnabled = false,automationName = XCUITest,browserName =,takesScreenshot = true,javascriptEnabled = true,platformName = iOS,udid = 0A41ECE4-6D03-4FEA-A82A-858FDBA6620E}]會話ID :6909c363-12a5-4a21-9298-c7f750ba7e09在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本機方法)在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java: 45)atg.openqa.selenium.remote上的org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:215)中的java.lang.reflect.Constructor.newInstance(Constructor.java:423),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)ato.appium.java_client.ios.IOSDriver.execute(IOSDriver.java:1)ato.appium.java_client.AppiumExecutionMethod.execute(AppiumExecutionMethod.java:46)at org。在org.openqa.selenium.html5.LocationContext $ setLocation.call的io.appium.java_client.AppiumDriver.setLocation(AppiumDriver.java:400)中的openqa.selenium.remote.html5.RemoteLocationContext.setLocation(RemoteLocationContext.java:50)來自org.codehaus的org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)的org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)。位於sun.reflect.NativeMethodAccessorImpl.invoke0(native方法)的executor.com.bqurious.keyword.mobile.ios.BqIosSetLocationTest.setLocation(BqIosSetLocationTest.groovy:72)中的groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:122) )在sun.reflect.DelegatingMethodAcc的sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) essorImpl.invoke(DelegatingMethodAccessorImpl.java:43)位於org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)的java.lang.reflect.Method.invoke(Method.java:498)。 junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)org.junit.internal.runners.statements.InvokeMethod。在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)在org.junit.runners.BlockJUnit4ClassRunner評估(InvokeMethod.java:17) .runChild(BlockJUnit4ClassRunner.java:57)位於org.junit的org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:290)org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:71)。 runners.ParentRunner.runChildren(ParentRunner.java:288)org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)org.junit.runners.ParentRunner $ 2.evaluate(P arentRunner.java:268)org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)at org org.eclipse.jdt.internal.junit.runner上的org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)中的.junit.runners.ParentRunner.run(ParentRunner.java:363) .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]用args調用AppiumDriver.deleteSession():[“6909c363-12a5-4a21 -9298-c7f750ba7e09“] [debug] [BaseDriver]事件'退出 SessionRequested'登錄於1504013038955(格林威治標准時間18:53:58 + 0530(IST))[調試] [JSONWP代理]將[DELETE / session / 6909c363-12a5-4a21-9298-c7f750ba7e09]代理為[DELETE http:// localhost:沒有主體的8100 / session / 43710C7E-2FDE-4A35-A2E0-4D309EE2CE9C] [調試] [JSONWP代理]得到狀態為200的響應:“{\\ n \\”值\\“:{\\ n \\ n},\\ n \\ “sessionId \\”:\\“28E97E0B-DF47-4325-8991-A28B77134EDB \\”,\\ n \\“status \\”:0 \\ n}“[XCUITest]關閉子進程[XCUITest]關閉xcodebuild進程(pid 37304 '/Users/omprakash.mishra/Library/Developer/Xcode/DerivedData/WebDriverAgent-dikkwtrisltbeobjmfvpthwwekvs'[XCUITest:)[XCUITest] xcodebuild聯編用碼 '空' 和信號 'SIGTERM'[調試] [XCUITest]找到WDA導出的數據文件夾中退出將'755'權限設置為'/Users/omprakash.mishra/Library/Developer/Xcode/DerivedData/WebDriverAgent-dikkwtrisltbeobjmfvpthwwekvs/Logs/Test/Attachments'文件夾[debug] [XCUITest]找到WDA派生數據文件夾:'/ Users / omprakash.mishra /庫/開發商/ Xcode中/ d erivedData / WebDriverAgent-folfazwwukpzfkegdblpnfuwlvfn'[XCUITest]將'755'權限設置為'/Users/omprakash.mishra/Library/Developer/Xcode/DerivedData/WebDriverAgent-folfazwwukpzfkegdblpnfuwlvfn/Logs/Test/Attachments'文件夾[debug] [XCUITest]不清除日志文件。 使用clearSystemFiles功能打開。 [debug] [iOSLog]停止iOS日志捕獲[Appium]從我們的主會話列表中刪除會話6909c363-12a5-4a21-9298-c7f750ba7e09 [調試] [BaseDriver]事件'quitSessionFinished'記錄在1504013039408(格林尼治標准時間18:53:59) 0530(IST))[debug] [MJSONWP]收到響應:null [debug] [MJSONWP]但是刪除會話,所以不返回[debug] [MJSONWP]用driver.deleteSession()結果響應客戶端結果:null [HTTP] < - DELETE / wd / hub / session / 6909c363-12a5-4a21-9298-c7f750ba7e09 200 461 ms - 76

這個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";
}

看來你需要一個AppiumDriver。 根據這個評論。

您可以使用setLocation方法在Android模擬器或iOS模擬器中設置緯度和經度:

import org.openqa.selenium.html5.Location;

位置loc = new Location(20.0,12.5,1000); //緯度,經度,高度driver.setLocation(loc);

我同意使用Apple腳本為iOS模擬器設置自定義地理位置的解決方案,因為Appium不支持iOS的這種方法(Apple沒有為XCTest框架提供模擬GPS位置的API)

Apple腳本:

#!/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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM