執行方法

因為 Appium 驅動程式實現的命令範圍比 W3C WebDriver 規範定義的命令範圍更廣,所以 Appium 需要一種方式讓這些“擴展”命令可以被客戶端庫訪問。 有兩種主要的策略

  1. Appium 驅動程式定義新的 W3C 兼容 API 路由,並且 Appium 客戶端更新以包含對這些新路由的支持。
  2. Appium 驅動程式定義所謂的“執行方法”,通過重載已經在任何基於 WebDriver 的客戶端庫中(包括所有 Selenium 和 Appium 客戶端)可用的 執行腳本 命令來提供新功能。

每種策略都有其優缺點,但最終決定如何實現新命令是由擴展作者來決定的。

本指南旨在幫助您了解“執行方法”策略。這種模式通常用於官方 Appium 驅動程式和其他第三方擴展。以下是 執行腳本 命令在 WebDriver 和瀏覽器自動化世界中的設計示例

await driver.executeScript('return arguments[0] + arguments[1]', [3, 4])
JavascriptExecutor jsDriver = (JavascriptExecutor) driver;
jsDriver.executeScript("return arguments[0] + arguments[1]", 3, 4);
driver.execute_script('return arguments[0] + arguments[1]', 3, 4)
driver.execute_script 'return arguments[0] + arguments[1]', 3, 4
((IJavaScriptExecutor)driver).ExecuteScript("return arguments[0] + arguments[1]", 3, 4);

這裡正在發生的是我們定義了要在網頁瀏覽器內執行的 Javascript 片段(技術上是一個函數體)。客戶端可以發送序列化的參數,通過 HTTP 發送,最終提供給函數作為參數。在此示例中,我們基本上定義了一個加法函數。 執行腳本 命令的返回值是 Javascript 片段的返回值!在此示例中,該值將是數字 73 + 4)。

每個客戶端庫都有其自己的方法來調用命令並向腳本函數提供任何參數,但函數本身 - 片段 - 始終是一個字符串,在所有語言中都是相同的。

在Appium的世界中,我們通常不會自動化網頁瀏覽器,這意味著這個命令並不特別有用。但它作為一種編碼任意命令名稱並提供參數的方法是有用的。例如,XCUITest Driver已經實現了一個命令,讓客戶端可以終止正在運行的應用程序,如果你知道應用程序的ID(即bundleId)。驅動程序通過執行方法mobile: terminateApp使此命令可用。客戶端不是提供JavaScript函數給“執行腳本”命令,而是提供了一個由驅動程序定義的已知字符串。客戶端需要知道的唯一其他事情是該方法的參數集,這些參數由驅動程序記錄。在這種情況下,我們有一個名為bundleId的參數,其值應該是編碼為要終止的應用程序的ID的字符串。以下是如何調用此執行方法:

await driver.executeScript('mobile: terminateApp', [{bundleId: 'com.my.app'}])
JavascriptExecutor jsDriver = (JavascriptExecutor) driver;
jsDriver.executeScript("mobile: terminateApp", ImmutableMap.of("bundleId", "com.my.app"));
driver.execute_script('mobile: terminateApp', {'bundleId': 'com.my.app'})
driver.execute_script 'mobile: terminateApp', { bundleId: 'com.my.app' }
((IJavaScriptExecutor)driver).ExecuteScript("mobile: terminateApp",
    new Dictionary<string, string> { { "bundleId", "com.my.app" } });

使用Appium執行方法與普通的Selenium Javascript執行有兩個重要的區別

  1. 腳本字符串只是一個命令名稱;它將由驅動程序文檔提供
  2. 提供參數的標准方法是作為一個單一對象,其中鍵代表參數名稱,值代表參數值。因此,在這種情況下,我們不得不指定參數名(bundleId)作為參數對象的鍵,並將參數值(com.my.app)作為該鍵的值。驅動程序可以將參數定義為必需可選

當然,始終參考特定執行方法的文檔,以查看作者是否對標準訪問方法進行了任何修改。