• 你的命令格式对吗?
    我是这么用的:

    pytest.main([test_folder,'--alluredir=%s' %(report_path),'-o log_cli=true -o log_cli_level=INFO'])
    
  • def get_result(number_list):
        first,last = 0,0
        lenth = len(number_list)
        for i in range(1,lenth):
            # print(lenth, i , lenth-i)
            if number_list[i]==0 or number_list[lenth-i]==0:
                if first ==0 and number_list[i]==0:
                    first = number_list[i-1]
                    print('found first :' ,first)
                if last ==0 and number_list[lenth-i]==0:
                    last = number_list[lenth-i+1]
                    print('found first :', last)
        if first == 0:
            print('no 0 in the list')
    
    
    # number_list = [-3,-2,-1,0,0,0,0,7,0,0,0,0,6,8,7]
    number_list = [-3,-2,-1,0,6,8,7]
    # number_list = [-3,-2,-1,6,8,7]
    # number_list = [-2,-1,0,6,0,0,7,0,8,14,22]
    get_result(number_list)
    
  • UI 自动化的意义 at 2019年01月16日

    UI 有 UI 的验证呢,和接口是互补的

  • UI 自动化的意义 at 2019年01月16日

    我们使用的情况:

    • 规模:产品一个前端、两个后台,加起来大概四百多条用例。
    • 维护:除非功能变动,否则基本上不需要维护。
    • 通过率: 95% 左右,个别用例因为测试数据问题要重跑。
    • 效果:主要是让回归测试有个底,不求发现什么 bug。
  • UI 自动化的意义 at 2019年01月16日

    这种话题一年要撕多少次啊?

  • 如果是必填项验证、签名校验等公共性的用例,可以考虑提取成公共的方法,不用每个接口都写一遍,应该可以节省一些工作量。
    这样可以把重点放在覆盖业务逻辑上了

  • 你的文件不能起名叫 appium.py , 这样 import 的时候会变成了从 appium.py 里找 webdriver
    文件名不要和对应的模块重复

  • 地点?

  • 记得 360 、猎豹都可以分享 PC 端的 wifi 给手机使用吧?

  • 最终编译出来就是一些 html 、js、 css 文件啊, flask 本身就是一个容器,所以直接把这些文件放到 flask 的静态文件目录里调用就可以了

  • mod route 就是控制路由

    @mod.route('/save_test_minder_content.json', methods=['POST', 'GET'])
    @user.authorize
    def save_test_minder_content():
    

    意思你访问 /save_test_minder_content.json ,就会跑到 save_test_minder_content() 方法里

  • 你可以研究下 ajax 如何跨域
    我是直接放在 flask 里面的,没有启动新的服务,所以没有跨域的问题

  • 大致的流程:

    • js 将界面上的内容通过 ajax 发送到后台接口。
    • 后台 view 里接收到对应数据后,保存到数据库。
  • 后台的保存吗?

    @mod.route('/save_test_minder_content.json', methods=['POST', 'GET'])
    @user.authorize
    def save_test_minder_content():
        log.log().logger.info(request)
        if request.method == 'GET':
            log.log().logger.info('post')
            return redirect("/test_minders")
        if request.method == 'POST':
            info = request.values
            log.log().logger.info('info :%s' %info)
            id = viewutil.getInfoAttribute(info,'id')
            content = viewutil.getInfoAttribute(info,'content')
            minder_id = ''
            if content == '':
                message =  '必填字段不得为空!'
                code = 500
            else:
                test_minder_manage.test_minder_manage().update_test_minder(id=id, fieldlist=['content'],valueList=[content])
                message = 'success!'
                code = 200
            result = jsonify({'code': code, 'msg': message})
            log.log().logger.info(result)
            log.log().logger.info('code is : %s'%code)
            return result
    
  • 目前只是做了数据加载和保存,暂时不支持多人协作

  • 都是封装 selenium 的方法处理,例如:

    def switchIframe(self,driver,para_list):
        method, value = para_list[0], para_list[1]
        # 切换 iframe
        if method=='css':
            method = By.CSS_SELECTOR
        driver.switch_to_frame(driver.find_element(by = method,value=value))
        time.sleep(2)
    
    def switchWindow(self,driver):
        for name in driver.window_handles:
            if name != driver.current_window_handle:
                driver.switch_to.window(name)
        time.sleep(2)
    
    
  • 要是有背景调查呢?

  • 可以加我 QQ 896745696

  • 一步步排查吧:

    1. js 方法有没触发。 可以在 js 里打印 log 来跟踪。
    2. 接口有没调用成功。 看 F12 - 网络下的请求记录和返回值。
    3. 2.1 如果有返回值,就看 js 处理是否成功,有没成功赋值、返回值格式是否正确;
    4. 2.2 如果没有返回值,看 view 里的对应方法处理是否正确
    1. 你的查询接口有返回这些对应数据吗?
    2. js 里有把这些返回值赋值给对应的参数吗?
    3. 另外我原来的 html 里有个 script,是要页面加载时自动点击一下 reset 按钮,调用 get edit info 接口来查数据,你看下新的页面里有没加这个。
  • F12 跟踪一下看下请求有没发送,还有参数是否正确

  • 看下你的 js 是不是成功调用了
    具体可以参考下我原来的 html 写法

  • 从后台获取用例的完整信息,是在 js 里实现的

    html 里的调用:

    <script>window.onload =function(){document.getElementById('btn_reset').click();}</script>
    

    对应的 js :
    /static/scripts/core/test_case.js

    // 编辑表单
    function get_edit_info(active_id)
      {
        if(!active_id)
        {
          alert('Error!');
          return false;
        }
    
        $.ajax(
            {
              url: "/test_case.json",
              data:{"id":active_id,"type":"test_case"},
              type: "get",
              dataType:"json",
              beforeSend:function()
              {
                return true;
              },
              success:function(data)
              {
                if(data)
                {
                  // 解析json数据
                  var data = data;
                  var data_obj = data.rows
    
                  // 赋值
                  $("#id").val(active_id);
                  $("#name").val(data_obj.name);
                  $("#steps").val(data_obj.steps);
                  $("#description").val(data_obj.description);
                  $("#type").val(data_obj.isPublic);
                  var isPublic = data_obj.isPublic;
                  if(isPublic == 1)
                  {
                    $("#type").val('公共用例');
                    setModule('公共用例');
                  }else{
                    $("#type").val('普通用例');
                    setModule('普通用例');
                  }
                  $("#module").val(data_obj.module);
                }
    
                else
                {
                  $("#tip").html("<span style='color:red'>失败,请重试</span>");
                 // alert('操作失败');
                }
              },
              error:function()
              {
                alert('请求出错');
              },
              complete:function()
              {
                // $('#tips').hide();
              }
            });
    
        return false;
      }
    
    
  • 可以考虑这样:
    公共配置里: runGroup = [1,2,3,4]

    用例标记:
    @pytest.mark.skipif(1 in runGroup,reason='skip')

    这样只需要每次在 runGroup 里修改要跑的组列表就可以了

  • 我这边是没问题的,如果你本地用 selenium 可以执行,可以检查一下:

    1. 是否同一台设备?
    2. 图片在平台运行的服务器或者 PC 上是否存在?
    3. 文件路径是否完全一致?
    4. 本地的 selenium 和平台调用的 selenium 是否同一个版本?

    填写 方法就是按 driver.find_element_by_xpath("/html/body/div[2]/div/div[2]/div/div[1]/div[2]/form/div[3]/div[2]/div/span/span/div[1]/span/input").send_keys("I:\3333.jpg") 这种格式进行封装的,所以如果 selenium 直接运行 ok ,理论上这样调用也没问题