经验就是:
每两次操作之间,一定要间隔几秒,不然可能会由于加载不完全,导致操作异常
初始隐藏的控件,要判断状态,等显示后再操作

最后输出:
测试截图的相似度百分比(之前某一次结果),用来做正确性验证,基本上相似度小余 90% 的都有点问题

密码:testerhome.com

PS:
原来不支持嵌入视频啊
相似度计算是看的 http://blog.csdn.net/gzlaiyonghao/article/details/2325027

现在搞不太清楚的就是怎么判断当前的位置,是在什么窗口下面,和如何打印出当前位置的所有控件

贴下代码

# coding:utf8
import logging
import histsimilar
import traceback
import time
import os
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, WebDriverException

logging.basicConfig(filename='log.txt',level=logging.INFO)
success = True
desired_caps = dict()
desired_caps['browserName'] = 'iOS'
desired_caps['platform'] = 'Mac'
desired_caps['version'] = '6.1'
desired_caps['app'] = os.path.abspath('测试app的位置')

#def is_alert_present(wd):
#    try:
#        wd.switch_to_alert().text
#        return True
#    except:
#        return False



def click(element):
    element.click()
    time.sleep(3)
    logging.info(str(c) + ' time click ' + wd.page_source)
    screenshot()


def send_keys(element, keys):
    element.send_keys(keys)
    time.sleep(3)
    logging.info(str(c) + ' time click ' + wd.page_source)
    screenshot()


def execute_script(script, args):
    wd.execute_script(script, args)
    time.sleep(3)
    screenshot()


def mk_new_dir():
    global path, base
    base = '截图存放的位置'
    if not os.path.isdir(base):
        path = base + '0/'
        os.mkdir(path)
        return
    path = base + str(len(os.listdir(base))) + '/'


c = 0


def screenshot():
    global c, path
    if not os.path.isdir(path):
        os.mkdir(path)
    wd.get_screenshot_as_file(path + str(c) + '.png')
    c += 1


def compare():
    dirs = list()
    for dirname in os.listdir(base):
        if os.path.isdir(base + dirname):
            dirs.append((os.path.getmtime(base + dirname), dirname))
    if len(dirs) < 3:
        return
    dirs.sort()
    new = dirs[len(dirs) - 1][1]
    previous = dirs[len(dirs) - 2][1]
    names = [(os.path.getmtime(base + new + '/' + filename), filename) for filename in
             os.listdir(base + new)]
    names.sort()
    for n in names:
        if n[1].startswith('.'):
            continue
        if os.path.exists(base + previous + '/' + n[1]):
            print n[1] + ' similarity : ' + str(
                int(histsimilar.calc_similar_by_path(base + new + '/' + n[1],
                                                     base + previous + '/' + n[1]) * 100)) + '%'


try:
    mk_new_dir()
    wd = webdriver.Remote('http://0.0.0.0:4723/wd/hub', desired_caps)
    wd.implicitly_wait(5)
    try:
        button = wd.find_element_by_name('点击开启')
        while not button.is_displayed():
            #screenshot()
            time.sleep(1)
        time.sleep(3)
        click(button)
    except WebDriverException, NoSuchElementException:
        logging.info('没有开机动画')
    click(wd.find_element_by_xpath("//window[1]/tableview[1]/cell[1]/button[1]"))
    click(wd.find_element_by_name(" 返回"))
    click(wd.find_element_by_xpath("//window[1]/tableview[1]/cell[1]/button[2]"))
    click(wd.find_element_by_name(" 返回"))
    click(wd.find_element_by_name("游记"))
    click(wd.find_element_by_name("qunar login"))
    send_keys(wd.find_element_by_xpath("//window[1]/image[2]/textfield[1]"), "lvtu@yopmail.com")
    send_keys(wd.find_element_by_xpath("//window[1]/image[3]/secure[1]"), "lvtu@yopmail.com")
    click(wd.find_element_by_name("登录"))
    try:
        click(wd.find_element_by_xpath("//window[1]/button[3]"))
    except:
        logging.info('没上传提示')
    click(wd.find_element_by_xpath("//window[1]/tableview[1]/cell[1]/text[1]"))
    click(wd.find_element_by_xpath("//window[1]/tableview[1]/cell[1]"))
    execute_script("mobile: swipe",
                   {"touchCount": 1, "startX": 157, "startY": 529, "endX": 156, "endY": 102, "duration": 0.5})
    click(wd.find_element_by_name(" 返回"))
    click(wd.find_element_by_name(" 返回"))
    click(wd.find_element_by_xpath("//window[1]/button[1]"))
except:
    traceback.print_exc()
    success = False
finally:
    if success:
        #raise Exception("Test failed.")
        compare()
        wd.quit()


计算图片相似度部分

# -*- coding: utf-8 -*-

import Image


def make_regalur_image(img, size=(256, 256)):
    return img.resize(size).convert('RGB')


def split_image(img, part_size=(64, 64)):
    w, h = img.size
    pw, ph = part_size

    assert w % pw == h % ph == 0

    return [img.crop((i, j, i + pw, j + ph)).copy() \
            for i in xrange(0, w, pw) \
            for j in xrange(0, h, ph)]


def hist_similar(lh, rh):
    assert len(lh) == len(rh)
    return sum(1 - (0 if l == r else float(abs(l - r)) / max(l, r)) for l, r in zip(lh, rh)) / len(lh)


def calc_similar(li, ri):
#   return hist_similar(li.histogram(), ri.histogram())
    return sum(hist_similar(l.histogram(), r.histogram()) for l, r in zip(split_image(li), split_image(ri))) / 16.0


def calc_similar_by_path(lf, rf):
    li, ri = make_regalur_image(Image.open(lf)), make_regalur_image(Image.open(rf))
    return calc_similar(li, ri)


def make_doc_data(lf, rf):
    li, ri = make_regalur_image(Image.open(lf)), make_regalur_image(Image.open(rf))
    li.save(lf + '_regalur.png')
    ri.save(rf + '_regalur.png')
    fd = open('stat.csv', 'w')
    fd.write('\n'.join(l + ',' + r for l, r in zip(map(str, li.histogram()), map(str, ri.histogram()))))
    #   print >>fd, '\n'
    #   fd.write(','.join(map(str, ri.histogram())))
    fd.close()
    import ImageDraw

    li = li.convert('RGB')
    draw = ImageDraw.Draw(li)
    for i in xrange(0, 256, 64):
        draw.line((0, i, 256, i), fill='#ff0000')
        draw.line((i, 0, i, 256), fill='#ff0000')
    li.save(lf + '_lines.png')


↙↙↙阅读原文可查看相关链接,并与作者交流