• Appium实现百词斩


    1.需求

    1.1需求

    自动完成百词斩背单词和单词对战。

    1.2分析

    1.实现百词斩背单词,首先打开百词斩,点击“开始复习吧”按钮开始背单词。其次,需要能够获取到当前单词的正确答案,可通过百词斩提供的提示获取单词正确答案。最后,通过正确答案和选项答案对比,点击有正确答案的选项,跳转至下一个单词页面,重复以上背单词步骤,完成背单词。

    2.

    2.设计

    从需求分析中,可总结出需要设计实现以下三种功能
    功能1需要能够连接并能够启动移动端app的工具帮助实现自动化
    功能2获取到单词的正确中文意思
    功能3识别选项中哪个是正确的答案

    功能1的设计实现,采用appium框架工具实现app自动化;

    功能2的设计实现,分为以下两个部分。

    1)启动百词斩。在app中启动百词斩,点击“开始复习吧!”按钮。
    2)获得单词正确答案。可以通过以下三种方式得到单词的正确答案。

    路线一,破解百词斩题目库,知道所有题目的答案。

    路线二,单词英文转中文翻译(这个肯定需要借助工具),拿到翻译后,根据中文词汇内容匹配,找到答案。

    路线三,通过查看背单词的答案形式。

    本项目是通过线路三,通过百词斩提供的提示获取单词正确答案。在答题页面,点击单词提示三次或者四次的时候,会跳转至单词答案提示页面,可从中提取到单词正确意思。

     功能3的设计实现,分为以下两个部分。

    1)获取选项中单词的中文意思。

    这里可以利用每个选项的xpath,得到每个选项中被识别出的文本。

    2)找到正确选项。

    把每个选项中的中文意思和正确答案进行对比,选择意思一样的选项作为正确答案。

    3.实现

    本项目分为四个部分完成,第一部分打开百词斩背单词界面;第二部分获取正确答案部分;第三部分获取四个选项的中文意思;第四部分对比中文意思,找出正确选项。

    3.1打开百词斩

    public static AndroidDriver getbaicizhanDriver() throws Exception {
            DesiredCapabilities capabilities = new DesiredCapabilities();
            // 模拟器类型
            // capabilities.setCapability("deviceName", "Android Emulator");
            capabilities.setCapability("deviceName", "device");
            // 自动化测试引擎
            capabilities.setCapability("automationName", "Appium");
            // 手机操作系统Android
            capabilities.setCapability("platformName", "Android");
            // 手机操作系统版本号
            capabilities.setCapability("platformVersion", "7.1.2");
            // app包名
            capabilities.setCapability("appPackage", "com.jiongji.andriod.card");
            // app中启动的 Activity名称
            capabilities.setCapability("appActivity", "com.baicizhan.main.activity.MainTabActivity");
            // noReset设置
            capabilities.setCapability("noReset", "true");
    
            AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
            return driver;
        }

    3.2获取正确答案

    public static void startPage(AndroidDriver driver) throws Exception {// 获取单词正确意思
            String chinese = "com.jiongji.andriod.card:id/lv";
            driver.findElementById(chinese).click();
            System.out.println("测试");
            Thread.sleep(10000);
            // 单词中文意思
            String text = driver.findElementById("com.jiongji.andriod.card:id/a6k").getText();
            System.out.println("单词意思" + text);
            Thread.sleep(1000);
            // return text;
        }

    3.3获取选项中的中文意思

    1.发现选择中中文是文本,这样就不需要使用截图的方式来获取每个选项的中文意思。

    2.一开始想获取到整个界面的所有代码,然后通过数组的方式获取到每个选项的文本,但是尝试后,发现获取到整个界面的代码后,没有办法取出每个选项的文本。

    3.使用xpath的方式来获取每个选项的文本。但是这样好像也获取不到选择的文本。

    4.发现可以点击每个选项中下边是可以获取到文本信息的。

     5.把四个选项的xpath存到一个数组中,遍历数组,获取文本信息。

    public static void findChoseText(AndroidDriver driver) {
            String[] allText_apath = {
                    "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.TextView",
                    "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.widget.FrameLayout/android.widget.TextView",
                    "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout[3]/android.widget.FrameLayout/android.widget.TextView",
                    "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout[4]/android.widget.FrameLayout/android.widget.TextView" };
            for (int i = 0; i < 4; i++) {
                String choseText = driver.findElementByXPath(allText_apath[i]).getText();
                System.out.println("选项中的中文意思" + choseText);
            }
        }

    3.4找出正确选项

    // 从四个选项中找出答案
            for (int i = 0; i < 4; i++) {
                String choseText = driver.findElementByXPath(allText_apath[i]).getText();
                String subWord[] = word.split("=");
                System.out.println("选项中的中文意思" + choseText);
                // 如果选项中的答案和单词意思是一样的,则为选项
                if (subWord[1].equals(choseText)) {
                    driver.findElementByXPath(allText_apath[i]).click();
                    break;
                }
            }

    4.测试

    1.运行程序,多次测试选择单词正确的答案测试,但是测试几次,后面有一些单词并不能选择正确的选项,有时程序会报错,查找原因才发现,原来我在设定获取单词的中文意思是根据点击提示次数来获取的。提示我是点击了三次,然后可以在单词答案详情页面得到单词的文本,而有的单词需要点击四次才能获取到单词的意思。如果都选择点击四次,那么会导致本来点击三次就可以找到答案的单词,会因为第四次点击提示,错过点击选项。

    2.这里想加一个判断,当点击三次提示后,判断是否已经找到单词意思,如果没有,则多点击一次。在点击三次后,如果需要点击第四次时,第四次元素的ID是找不到的,会抛出异常,需要捕获异常,并且进行第四次点击。(只存在需要点击三次和四次就可以查看单词答案详情页面的情况)

    3.判断单词存在并捕获异常的代码。

        public static boolean byElementIsExist(AndroidDriver driver, String chinese) {
            System.out.println("进入判断元素是否存在函数:" + chinese);
            try {
    
    //            driver.findElement(by);
                driver.findElementById(chinese);
    
                return true;
            } catch (Exception e) {
    
                e.printStackTrace();
                System.out.println("没有找到元素");
                // TODO: handle exception
                return false;
            }
        }

    5.结果

    实现自动背单词斩。

    6.PSP

  • 相关阅读:
    使用textarea标签按Enter键后web页面中成换行 vue
    关于json数组对象和对象数组遇到的一些问题
    vue.js实现checkbox的全选和反选
    关于arcgis js 中要素更新的问题
    C# 图片上传问题
    arcgis js 几种拓扑关系详解
    ISS部署网站--HTTP 错误 404.17
    ADODB.Stream在进行文件上传时报错
    window.open 打开Excel或者Word 无权限问题
    Aspose.cell生成表格
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/16206816.html
Copyright © 2020-2023  润新知