在阿里云移动测试上跑appium(921)

前提

你需要一个能在本地跑通的自动化测试脚本。

踩过的坑

1. 找不到启动页

在我这里app的launch页面是welcome,展示splash两秒后进入guide页面,但由于之前没有控制好显示时间,welcome基本上是一闪而过,没有给脚本获取当前页面的时间,就会报找不到启动页的错误。
解决方案:在启动页停留一会。

2. native控件找不到

因为本地是能够找得到的,所有有可能是阿里云上面的测试机和本地的性能有差异,脚本执行到去找某一个页面的控件,但是这个页面还没加载出来,就会报找不到控件的错误。
解决方案:

self.driver.wait_activity('GuideActivity', 3)
3. 无法切换到webview的context

因为阿里云对chromeDriver做了处理,所以我们无法直接self.driver.switch_to.context(contexts[1])
解决方案:
参考录制脚本生成的脚本文件,可以直接将其AppiumLib.py复制过来,或者像我一样把切换context相关的代码复制到main.py

from appium import webdriver
import desired_capabilities
from unittest import TestCase
import unittest
import time
import os
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import shutil

不记得那些是为了解决问题而加的依赖,所以全部粘过来。

def switchToWebviewContext(self):
        contexts = self.driver.contexts
        webviewContextIndex = None
        packageName = self.driver.desired_capabilities.get("appPackage")
        self.log("INFO", "packageName is %s" % packageName)
        for index in range(0, len(contexts)):
            self.log("INFO", "context index is %s" % index)
            self.log("INFO", "context[%s] is %s" % (index, contexts[index]))
            if "WEBVIEW" in contexts[index] and packageName in contexts[index]:
                webviewContextIndex = index
                self.log("INFO", "webviewContextIndex is %s" % webviewContextIndex)
        if webviewContextIndex is not None:
            self.log("INFO", "switch to %s" % contexts[webviewContextIndex])
            self.log("INFO", "webviewContextIndex is %s" % webviewContextIndex)
            self.switchContext({"wait": 20, "contextIndex": webviewContextIndex})
 
def switchContext(self, content, wait=6):
        contexts = self.driver.contexts
        self.log(INFO, "contexts is %s" % contexts)

        if contexts is None:
            return

        contextIndex = content.get("contextIndex")
        wait = content.get("wait")
        self.log("INFO", contextIndex)
        context = contexts[contextIndex]
        
        if context is None or "NATIVE_APP" in context:
            self.driver.switch_to.context(context)
            return
        if wait is None or wait < 6:
            wait = 6

        startTime = time.time()
        hasContext = False
        while time.time() - startTime < wait:
            if "WEBVIEW" in context:
                hasContext = True
                break
            time.sleep(0.5)

        if not hasContext:
            raise Exception("no useable context found")

        # chromedriver目录
        chromedriverDir = "/usr/lib/node_modules/appium/node_modules/appium-chromedriver/chromedriver/linux/chromedriver_64_2.%s"
        if self.appiumVersion > ABSOLUTE_COORDINATES_APPIUM_VERSION:
            # 1.8.0 chromedriver path
            chromedriverDir = "/appium/appium/node_modules/appium-chromedriver/chromedriver/linux/chromedriver_64_2.%s"
        # chromedriverDir = "/Users/skiluo/workspace/automation/appium-source/appium-chromedriver/chromedriver/mac/chromedriver_64_2.%s"
        # 若没有传入chromedriverExecutable,则失败
        executablePath = self.driver.capabilities.get('chromedriverExecutable')
        if executablePath is None:
            raise Exception("chromedriverExecutable path has not been set")
        defaultVersion = self.driver.capabilities.get('chromedriverDefaultVersion')
        self.log(INFO, "executablePath is %s, default version is %s" %
                 (executablePath, defaultVersion))
        if defaultVersion is not None:
            try:
                chromedriverFile = chromedriverDir % defaultVersion
                self.copyChromedriver(chromedriverFile, executablePath)
                self.driver.switch_to.context(context)
                self.log(INFO, "switch to %s" % context)
                return
            except Exception, e:
                self.log(
                    ERROR, "switch context with default version failed, %s" % str(e))
        while self.chromeDriverVersion >= 4:
            chromedriverFile = chromedriverDir % self.chromeDriverVersion
            self.copyChromedriver(chromedriverFile, executablePath)
            self.log("INFO", "use chromedriver_64_2.%s" %
                     self.chromeDriverVersion)
            try:
                self.driver.switch_to.context(context)
                self.log("RPC", "set default chromeversion %s" %
                         self.chromeDriverVersion)
                self.driver.capabilities['chromedriverDefaultVersion'] = self.chromeDriverVersion
                break
            except Exception, e:
                pass
            self.chromeDriverVersion -= 1

        if self.chromeDriverVersion < 4:
            raise Exception("no suitable chromedriver")

    def copyChromedriver(self, srcFile, destFile):
        # kill chromedriver before copy
        os.system("pkill chromedriver")
        if os.path.exists(srcFile):
            shutil.copy(srcFile, destFile)
        else:
            raise Exception("chrome executable file not found")

def log(self, level, info):
    print("%s : %s" % (level, info))

在需要切换到webcontext的地方直接调用即可:

self.switchToWebviewContext()

吐槽

至此,我终于在阿里云上面跑通了登录脚本。
真的搞不懂了,那么大的公司,提供的文档还是以eclipse示例,都8102年了啊,完全没有参考价值。

而且明明需要用户手动对context做处理,但是文档只字未提,发工单也不回,我只能不停的百度和谷歌,耽误我好几天,最后不停的发工单才拉了个小群讨论,每次讨论完都基本上是说自己设备可能有问题,需要看一下,然后我又得等。

有这么多坑就算了,费用还贼贵,五百块测五十次,ios价格还翻倍,由于是老大购买的,我不知道价格,几天500块就没了,现在都是一台一台的测试脚本是否通了,通了才敢多台设备一起测。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,096评论 4 62
  • 内容 抽屉菜单 ListView WebView SwitchButton 按钮 点赞按钮 进度条 TabLayo...
    小狼W阅读 1,613评论 0 10
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,751评论 1 92
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,402评论 0 17
  • 见过非常平易近人女人,身上好像有很多值得褒奖的品质,她们总是对别人低下头,俯下身,无微不至,用最谦卑的态度对人。 ...
    蠢狗勿进阅读 446评论 0 1