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