appium——微信小程序自動化


由於騰訊系QQ、微信是基於騰訊自研X5內核-類似webview,不是谷歌原生webview,所以調試會有些許差異(有很 多app廠商也開始采用X5內核)
微信小程序自動化測試只能夠支持手機,模擬器是不行的

step1:手機打開開發者模式連接上電腦,打開微信小程序webview調試開關

在微信聊天窗口發送如下URL:

http://debugmm.qq.com/?forcex5=true

http://debugx5.qq.com

step2:UC開發者工具識別小程序的web元素信息

step3:確認微信小程序對應的進程名 -- com.tencent.mm:appbrand0

微信有很多的進程,我們要確定當前小程序是位於哪個進程中:

adb shell dumpsys activity top | findstr ACTIVITY 查詢前台運行的所有進程

找到AppBrandUI后面的pid

adb shell ps + pid得到進程名

 

 

 

注意

1、不清除微信數據

2、微信小程序自動化chromeDriver 一定得要用V2.40版本,版本匹配跟正常chrome~ChromeDriver不一樣,比較特殊,在appium的chromdriver目錄下替換2.40的chromedriver.exe文件

替換文件夾路徑參考:https://www.cnblogs.com/erchun/p/13335305.html

3、微信小程序可能會打開很多窗口,有些窗口是沒有用的,所以要切換句柄

public class SmallProgramTeest {
    //driver定義成全局變量
    public AndroidDriver driver;
    @BeforeTest
    public void setUp() throws MalformedURLException {
        //創建一個配置對象,保存這四個配置
        DesiredCapabilities capabilities = new DesiredCapabilities();
        //1、指定platformName--平台名
        capabilities.setCapability("platformName","Android");
        //2、指定deviceName-設備名
        capabilities.setCapability("deviceName","08e7c5997d2a");
        //3、指定appPackage --測試App標識
        capabilities.setCapability("appPackage","com.tencent.mm");
        //4、指定appActivity --啟動App的
        capabilities.setCapability("appActivity","com.tencent.mm.ui.LauncherUI");
        //!!!不清除掉微信的數據
        capabilities.setCapability("noReset",true); //讓配置生效--要和Appium Server建立通訊連接,把這些配置傳遞給Appium服務  --驅動
        //兩個參數:第一個參數:Appium通訊地址(包括IP地址+端口號) 第二個參數:配置對象
        // 支持X5內核應用自動化配置
        capabilities.setCapability("recreateChromeDriverSessions", true);
        // ChromeOptions使用來定制啟動選項,因為在appium中切換context識別webview的時候,
        // 由於小程序是在一個單獨的進程中,所以需要加上androidProcess: com.tencent.mm:appbrand0
        ChromeOptions options = new ChromeOptions();
        // 第二個參數要改成你查詢到的小程序進程名--只需要改androidProcess對應的值-查詢到的微信小程序的進程名
        options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
        capabilities.setCapability(ChromeOptions.CAPABILITY, options);
        // 初始化會默認將chrome瀏覽器打開,需要將Browser置為空
        capabilities.setBrowserName("");
        URL url = new URL("http://127.0.0.1:4723/wd/hub");
        //初始化動作,打開測試App
        driver = new AndroidDriver(url,capabilities);
        //隱式等待
        driver.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);
    }

    @Test
    public void testSmallProgram() throws InterruptedException {
        //1、等待一會兒,等待微信主頁加載完畢
        Thread.sleep(20000);
        //2、向下滑動
        swipeDown();
        //3、點擊選擇小程序
        driver.findElementByAndroidUIAutomator("new UiSelector().text(\"微信app里定位到的小程序名\")").click();
        //4、等待小程序加載完畢
        Thread.sleep(10000);
        //切換context -- 》 context名字:WEBVIEW_com.tencent.mm:appbrand0
        driver.context("WEBVIEW_com.tencent.mm:appbrand0");
        //獲取到微信小程序打開所有窗口的句柄(小程序可能會打開很多窗口,有些窗口是沒有用的)
        Set<String> handlers = driver.getWindowHandles();
        //遍歷所有的句柄,找到正確的窗口
        for (String handle : handlers){
        //如果當前窗口的名字=想要的小程序窗口名
            if(driver.getTitle().equals("想要的小程序窗口名")){
                //找到了對應的窗口,退出循環
                break;
            }else {
                //找到的窗口不符合,切換句柄,直到找到正確的為止
                driver.switchTo().window(handle);
            }
        }
        //在正確的窗口里面去定位元素
        driver.findElement(By.xpath("//a[contains(text(),'課程')]")).click();

        //chromeDriver 一定得要用V2.40版本
        //版本匹配跟正常chrome~ChromeDriver不一樣,比較特殊
    }

    public void swipeDown(){
        //由屏幕的寬和高來決定滑動的起始點和終止點
        int width = driver.manage().window().getSize().getWidth();
        int height = driver.manage().window().getSize().getHeight();
        //向下滑動
        TouchAction touchAction = new TouchAction(driver);
        //press:按壓某一個坐標 moveTo:滑動到某一個點 release:手指的釋放
        //滑動的起始點坐標
        PointOption pointOption1 = PointOption.point(width/2,height/5);
        //滑動的終止點坐標
        PointOption pointOption2 = PointOption.point(width/2,height*4/5);
        //waitAction方法需要傳入waitOption類型的參數
        Duration duration = Duration.ofMillis(300);
        WaitOptions waitOptions = WaitOptions.waitOptions(duration);
        touchAction.press(pointOption1).waitAction(waitOptions).moveTo(pointOption2).release().perform();
    }
}
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM