• 承接一楼,不仅要懂技术,还要懂产品,懂运营
    产品运营的书的话,建议看看《人人都是产品经理》 《运营之光》《增长黑客》等等
    上班地铁上看看还蛮轻松的

  • 看了一下我以前的写法,如下:

    results = subprocess.Popen("adb devices", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines()
    for line in results:
    print line

    仅供参考,很久没写了,也不知道现在能不能用了

    里面有些方法,希望能够提供帮助
    https://github.com/NJ-zero/Android-Excel

  • 求助一个诡异的问题 at July 23, 2019

    同步一下解决方案:
    新增了一个字段featurevaluestring ,将 uint64 转 string 后,前端取 featurevaluestring 字段,显示无误

    感谢3楼

  • 使用课上用的方法

    By close = By.id("close")

    如何做到兼容ios和android?

    • 搜索从yaml中读取数据

    Github 地址:https://github.com/NJ-zero/Test_appium_demo

    yaml文件如下:

    input:
    - pdd
    - alibaba
    exp:
    - 拼多多
    - 阿里巴巴

    脚本如下:

    @ParameterizedTest
    @CsvSource({
    "pdd,拼多多","alibaba,阿里巴巴"
    })
    public void search(String key,String name){
    String res = searchPage.search(key).getall().get(0);
    assertThat(res,equalTo(name));
    }

    @ParameterizedTest
    @CsvFileSource(resources="/data/SearchTest.csv")
    public void searchbycsv(String en,String cn){
    System.out.println(en);
    System.out.println(cn);
    String res = searchPage.search(en).getall().get(0);
    }

    @ParameterizedTest
    @MethodSource("Getyaml")
    public void searchbyyaml(String en,String cn){
    System.out.println(en);
    System.out.println(cn);
    String res = searchPage.search(en).getall().get(0);
    assertThat(res,equalTo(cn));

    }

    static Stream<Arguments> Getyaml() {
    Config conf = Config.load("/data/testdata.yaml");
    return Stream.of(arguments(conf.input.get(0),conf.exp.get(0)),
    arguments(conf.input.get(1),conf.exp.get(1)));
    }
  • node版本是个大坑,千万不要

    brew install node

    看作者的建议

    最终版本

    xxxxMacBook-Pro:~ xxo$ node -v
    v8.14.0
    xxxxMacBook-Pro:~ xxo$ npm -v
    6.4.1

    参考MAC下STF安装及踩坑

  • page

    一共三个page: home page search page zixuan page

    • home page

      public class MainPage extends BasePage {
      By profile= By.id("user_profile_icon");
      By search= By.id("home_search");

      public static MainPage start(){
      android_driver.start();
      return new MainPage();
      }

      public ProfilePage getprofile(){
      android_driver.getcurrentdriver().findElement(profile).click();
      return new ProfilePage();
      }

      public SearchPage gotosearch(){
      find(search).click();
      return new SearchPage();
      }

      public ZixuanPage gotozixuan(){
      android_driver.getcurrentdriver().findElement(By.xpath("//*[@text='自选']")).click();
      return new ZixuanPage();
      }
      }
    - searchpage

    ``` java
    public class SearchPage extends BasePage{

    public SearchPage search(String key){
    find(By.className("android.widget.EditText")).sendKeys(key);
    return this;
    }

    public MainPage cancle(){
    android_driver.getcurrentdriver().findElement(By.id("action_close")).click();
    return new MainPage();
    }

    public ArrayList<String> getall(){
    ArrayList<String> array = new ArrayList<String>();
    for(WebElement e:android_driver.getcurrentdriver().findElements(By.id("stockName"))){
    array.add(e.getText());
    }
    return array;
    }

    public ZixuanPage cancletozixuan(){
    /*
    返回自选页
    */

    find(By.id("action_close")).click();
    return new ZixuanPage();

    }

    public SearchPage add(String key){
    find(By.className("android.widget.EditText")).sendKeys(key);
    android_driver.getcurrentdriver().findElements(By.id("follow_btn")).get(0).click();
    return this;
    }
    }
    • zixuanpage
    public class ZixuanPage extends BasePage {

    public SearchPage gotosearch(){
    find(By.id("action_create_cube")).click();
    return new SearchPage();
    }

    public ZixuanPage canceladd(String name){
    TouchAction action = new TouchAction(android_driver.getcurrentdriver());
    String text = String.format("//*[@text='%s']",name);
    WebElement added = android_driver.getcurrentdriver().findElement(By.xpath(text));
    action.longPress(added).release().perform();
    find(By.xpath("//*[@text='删除']")).click();
    return this;
    }

    public ArrayList<String> getall(){
    ArrayList<String> array = new ArrayList<String>();
    for(WebElement e:android_driver.getcurrentdriver().findElements(By.id("portfolio_stockName"))){
    array.add(e.getText());
    }
    return array;
    }

    }

    测试

    • zixuantest
    public class ZixuanTest {

    static MainPage mainPage;
    static SearchPage searchPage;
    static ZixuanPage zixuanpage;

    @BeforeAll
    public static void before(){
    mainPage=MainPage.start();
    zixuanpage=mainPage.gotozixuan();

    }

    @ParameterizedTest
    @CsvSource({"alibaba,阿里巴巴",
    "qtt,趣头条",
    "pdd,拼多多"
    })
    public void add(String stockname,String cn_name) {
    SearchPage searchPage = zixuanpage.gotosearch();
    searchPage.add(stockname);
    zixuanpage = searchPage.cancletozixuan();
    ArrayList<String> stocks=new ArrayList<String>();
    stocks =zixuanpage.getall();
    assertTrue(stocks.contains(cn_name));

    }

    @ParameterizedTest
    @CsvSource({"阿里巴巴",
    "趣头条",
    "拼多多"})
    public void cancel(String name){
    zixuanpage.canceladd(name);
    }
    }
  • 老师,请教:

    1. 如何比较好的做到,用例执行失败的情况下不影响下一个用例的执行
    2. 定位常用的元素是直接写在page文件中,还是维护在其他文件如yaml、txt等
    3. 一套脚本如何比较做到同时适用android和ios
  • 两天了居然没人回答,那我就第一个吧,抛砖引玉。

    检测覆盖率

    用到的第三方插件是 pytest-cov
    Github地址
    安装方法

    pip install pytest-cov

    使用方法:

    pytest   --cov=xxxxx

    最终结果如下:

  • 分别以mysql数据库,csvyamlxml四种方式作为数据驱动

    老铁,这边的实现可以share一下嘛?

  • 参数化

    @DataProvider
    public Object[][] buy(){
    return new Object[][]{
    {"","","用户名或密码不能为空",1,1,-2},
    {"admin","123","欢迎管理员",1,1,0},
    {"admin","123","欢迎管理员",2,-1,-1},
    {"wade","123","欢迎wade",2,1,1},
    {"admin","","用户名或密码不能为空",1,-1,-2},
    {"wade","123","欢迎wade",3,1,1},
    {"wade","123","欢迎wade",3,3,0}
    };
    }

    脚本

        @BeforeClass
    public void login(){
    System.out.println("测试开始");
    }

    @Test(dataProvider = "buy",dataProviderClass = ShoppingData.class )
    public void testbuys(String user,String pwd,String logininfo,int proId,int buynum,int res){
    // Login login = new Login();
    String s=login.userLogin(user,pwd);
    Assert.assertEquals(s,logininfo);
    int result = shopping.buys(proId,buynum);
    Assert.assertEquals(result,res);
    }


    @AfterClass
    public void setnum(){
    for(Products product : Products.values()){
    if(product.getProId() == 1){
    product.setCount(0);
    }else if (product.getProId()==2){
    product.setCount(10);
    }else {
    product.setCount(1);
    }
    }
    }

    testng.xml配置

    <class name="TestXunit.ShoppingTest">
    <methods>
    <include name="testbuys"></include>
    </methods>
    </class>

    结果

  • 不好意思,没有哦~
    因为之前打包成exe后,在同事电脑上试了,无法使用,不确定是不是adb环境变量的问题。
    如果你能够打包成功并在其他电脑上使用的话,那真是非常赞了。

    源码在:https://github.com/NJ-zero/AATT

  • npm ERR! bufferutil@1.3.0 install: node-gyp rebuild

    npm ERR! Failed at the bufferutil@1.3.0 install script.
    hello 请问最后你这个问题解决了吗?

    • 第一题
      我理解的就是 netstat -ntp的最后一列

      netstat -ntp | sed 1,2d|awk '{print $6}'|sort |uniq

    • 第二题
      在之前的基础上修改了一下,所以显得比较长,会将所有回复的点赞数打印出来,如果打印第一条,加上head -1即可

      a=`curl -s https://testerhome.com/topics/excellent | grep -o "topic media topic-[0-9]*" | grep topic | awk -F '-' '{print $2}'|head -5`;for id in $a;do url='https://testerhome.com/topics/'$id;reply=`curl -s $url|grep -o -m1 '共收到 <b>[0-9]*'|awk -F '>' '{print $2}'`;if [ -n "$reply" ] ;then echo $url '回复数量:' $reply;else echo $url '回复数量:' 0;fi;repllzans=`curl -s 'https://testerhome.com/topics/'$id | grep 'data-count' |grep 'Reply' | grep 'data-count="[0-9]*'|awk '{print $3}'|awk -F'"' '{print $2}'`;count=1;for zan in $repllzans;do echo 第$count'条回复点赞数为:'$zan;count=$(( $count+1 ));done; done;

    • 第一题

      netstat -ntp | sed 1,2d | awk '{print $5}'|awk -F ':' '{print $1}' |sort | uniq 
    • 第二题

      a=`curl -s https://testerhome.com/topics/excellent | grep -o "topic media topic-[0-9]*" | grep topic | awk -F '-' '{print $2}'`;for id in $a;do url='https://testerhome.com/topics/'$id;zan=`curl -s $url|grep -o -m1 '<span>[0-9]*'|awk -F '>' '{print $2}'`;if [ -n "$zan" ] ;then echo $url '点赞人数:' $zan;else echo $url '点赞人数:' 0;fi;done;

  • Author only
  • 文章相似度计算 at October 16, 2018

    哈哈,一下子回复三条,厉害了
    1.这个一开始只是帮一个中科大学的朋友做的,主要是实现他的需求,算法思路是他定好的。
    2.如果婚恋的推荐,我可以将男生理解成国务院,女生理解成地方(这边没有丝毫歧视的意思,倒过来也可以),这样就不存在男生和男生对比相似度的问题
    3.很好奇 可以用来 判断 红楼梦后边 那堆是不是老曹写的
    这个是什么个思路

  • Author only
  • 文章相似度计算 at October 16, 2018

    哈哈,这个锅可大了。
    我有社会主义核心价值观镇楼,不怕!

  • Author only
  • Author only
  • 如何让 APP 崩溃? at July 19, 2018

    传东西的话,就adb push 命令吧😂 😂

  • 如何让 APP 崩溃? at July 18, 2018

    一般通过工具(如charles),打断点,改请求参数或改返回。
    或者通过工具将手机内存占满,在手机状况不佳的情况下测试

  • Author only