[Android测试] AS+Appium+Java+Win 自动化测试之六 Appium的Java测试脚本封装

本文介绍了一种针对Android应用UI自动化测试的方法,并提供了详细的代码实现。通过封装显式等待等常用操作,提高了测试脚本的稳定性和可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、为什么需要封装?

封装的本意就是为了方便、简洁。

二、Android的显式等待封装

1. AndroidDriverWait.java

<code class="hljs avrasm has-numbering">package <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.example</span><span class="hljs-preprocessor">.base</span><span class="hljs-comment">;</span>

<span class="hljs-comment">/**
 * Created by LITP on 2016/9/8.
 */</span>

import org<span class="hljs-preprocessor">.openqa</span><span class="hljs-preprocessor">.selenium</span><span class="hljs-preprocessor">.NotFoundException</span><span class="hljs-comment">;</span>
import org<span class="hljs-preprocessor">.openqa</span><span class="hljs-preprocessor">.selenium</span><span class="hljs-preprocessor">.TimeoutException</span><span class="hljs-comment">;</span>
import org<span class="hljs-preprocessor">.openqa</span><span class="hljs-preprocessor">.selenium</span><span class="hljs-preprocessor">.WebDriver</span><span class="hljs-comment">;</span>
import org<span class="hljs-preprocessor">.openqa</span><span class="hljs-preprocessor">.selenium</span><span class="hljs-preprocessor">.WebDriverException</span><span class="hljs-comment">;</span>
import org<span class="hljs-preprocessor">.openqa</span><span class="hljs-preprocessor">.selenium</span><span class="hljs-preprocessor">.remote</span><span class="hljs-preprocessor">.RemoteWebDriver</span><span class="hljs-comment">;</span>
import org<span class="hljs-preprocessor">.openqa</span><span class="hljs-preprocessor">.selenium</span><span class="hljs-preprocessor">.support</span><span class="hljs-preprocessor">.ui</span><span class="hljs-preprocessor">.Clock</span><span class="hljs-comment">;</span>
import org<span class="hljs-preprocessor">.openqa</span><span class="hljs-preprocessor">.selenium</span><span class="hljs-preprocessor">.support</span><span class="hljs-preprocessor">.ui</span><span class="hljs-preprocessor">.FluentWait</span><span class="hljs-comment">;</span>
import org<span class="hljs-preprocessor">.openqa</span><span class="hljs-preprocessor">.selenium</span><span class="hljs-preprocessor">.support</span><span class="hljs-preprocessor">.ui</span><span class="hljs-preprocessor">.Sleeper</span><span class="hljs-comment">;</span>
import org<span class="hljs-preprocessor">.openqa</span><span class="hljs-preprocessor">.selenium</span><span class="hljs-preprocessor">.support</span><span class="hljs-preprocessor">.ui</span><span class="hljs-preprocessor">.SystemClock</span><span class="hljs-comment">;</span>

import java<span class="hljs-preprocessor">.util</span><span class="hljs-preprocessor">.concurrent</span><span class="hljs-preprocessor">.TimeUnit</span><span class="hljs-comment">;</span>

import io<span class="hljs-preprocessor">.appium</span><span class="hljs-preprocessor">.java</span>_client<span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.AndroidDriver</span><span class="hljs-comment">;</span>

public class AndroidDriverWait extends FluentWait<AndroidDriver> {
    public final static long DEFAULT_SLEEP_TIMEOUT = <span class="hljs-number">500</span><span class="hljs-comment">;</span>
    private final WebDriver driver<span class="hljs-comment">;</span>

    public AndroidDriverWait(AndroidDriver driver, long timeOutInSeconds) {
        this(driver, new SystemClock(), Sleeper<span class="hljs-preprocessor">.SYSTEM</span>_SLEEPER, timeOutInSeconds, DEFAULT_SLEEP_TIMEOUT)<span class="hljs-comment">;</span>
    }


    public AndroidDriverWait(AndroidDriver driver, long timeOutInSeconds, long sleepInMillis) {
        this(driver, new SystemClock(), Sleeper<span class="hljs-preprocessor">.SYSTEM</span>_SLEEPER, timeOutInSeconds, sleepInMillis)<span class="hljs-comment">;</span>
    }


    public AndroidDriverWait(AndroidDriver driver, Clock clock, Sleeper sleeper, long timeOutInSeconds,
                             long sleepTimeOut) {
        super(driver, clock, sleeper)<span class="hljs-comment">;</span>
        withTimeout(timeOutInSeconds, TimeUnit<span class="hljs-preprocessor">.SECONDS</span>)<span class="hljs-comment">;</span>
        pollingEvery(sleepTimeOut, TimeUnit<span class="hljs-preprocessor">.MILLISECONDS</span>)<span class="hljs-comment">;</span>
        ignoring(NotFoundException<span class="hljs-preprocessor">.class</span>)<span class="hljs-comment">;</span>
        this<span class="hljs-preprocessor">.driver</span> = driver<span class="hljs-comment">;</span>
    }

    @Override
    protected RuntimeException timeoutException(String message, Throwable lastException) {
        TimeoutException ex = new TimeoutException(message, lastException)<span class="hljs-comment">;</span>
        ex<span class="hljs-preprocessor">.addInfo</span>(WebDriverException<span class="hljs-preprocessor">.DRIVER</span>_INFO, driver<span class="hljs-preprocessor">.getClass</span>()<span class="hljs-preprocessor">.getName</span>())<span class="hljs-comment">;</span>
        if (driver instanceof RemoteWebDriver) {
            RemoteWebDriver remote = (RemoteWebDriver) driver<span class="hljs-comment">;</span>
            if (remote<span class="hljs-preprocessor">.getSessionId</span>() != null) {
                ex<span class="hljs-preprocessor">.addInfo</span>(WebDriverException<span class="hljs-preprocessor">.SESSION</span>_ID, remote<span class="hljs-preprocessor">.getSessionId</span>()<span class="hljs-preprocessor">.toString</span>())<span class="hljs-comment">;</span>
            }
            if (remote<span class="hljs-preprocessor">.getCapabilities</span>() != null) {
                ex<span class="hljs-preprocessor">.addInfo</span>(<span class="hljs-string">"Capabilities"</span>, remote<span class="hljs-preprocessor">.getCapabilities</span>()<span class="hljs-preprocessor">.toString</span>())<span class="hljs-comment">;</span>
            }
        }
        throw ex<span class="hljs-comment">;</span>
    }
}
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li></ul>

2.ExpectedCondition.java

接口

<code class="hljs axapta has-numbering">package com.example.base;

import com.google.<span class="hljs-keyword">common</span>.base.Function;

import io.appium.java_client.android.AndroidDriver;

<span class="hljs-comment">/**
 * Created by LITP on 2016/9/8.
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">ExpectedCondition</span><<span class="hljs-title">T</span>> <span class="hljs-inheritance"><span class="hljs-keyword">extends</span></span> <span class="hljs-title">Function</span><<span class="hljs-title">AndroidDriver</span>, <span class="hljs-title">T</span>> {</span>}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul>

3. 使用

<code class="hljs java has-numbering"> <span class="hljs-javadoc">/**
     * 显示等待,等待Id对应的控件出现time秒,一出现马上返回,time秒不出现也返回
     */</span>
    <span class="hljs-keyword">public</span> AndroidElement <span class="hljs-title">waitAuto</span>(By by, <span class="hljs-keyword">int</span> time) {
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> AndroidDriverWait(driver, time)
                    .until(<span class="hljs-keyword">new</span> ExpectedCondition<AndroidElement>() {
                        <span class="hljs-annotation">@Override</span>
                        <span class="hljs-keyword">public</span> AndroidElement <span class="hljs-title">apply</span>(AndroidDriver androidDriver) {
                            <span class="hljs-keyword">return</span> (AndroidElement) androidDriver.findElements(by);
                        }
                    });
        } <span class="hljs-keyword">catch</span> (TimeoutException e) {
            Assert.fail(<span class="hljs-string">"查找元素超时!! "</span> + time + <span class="hljs-string">" 秒之后还没找到元素 ["</span> + by.toString() + <span class="hljs-string">"]"</span>, e);
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
        }
    }</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul>

三、Assert断言的封装

封装了 出现错误输出了异常信息但不终止程序的运行,会继续往下执行。

1.Assertion.java

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> com.example.base;

<span class="hljs-keyword">import</span> org.testng.Assert;

<span class="hljs-keyword">import</span> java.util.ArrayList;
<span class="hljs-keyword">import</span> java.util.List;

<span class="hljs-javadoc">/**
 * Created by LITP on 2016/9/21.
 */</span>

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Assertion</span> {</span>


    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> flag = <span class="hljs-keyword">true</span>;                      <span class="hljs-comment">//是否有错误</span>

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> List<Error> errors = <span class="hljs-keyword">new</span> ArrayList<>();    <span class="hljs-comment">//错误集合</span>

    <span class="hljs-javadoc">/**
     * 验证值是否相等
     *<span class="hljs-javadoctag"> @param</span> actual 第一个值
     *<span class="hljs-javadoctag"> @param</span> expected 要对比的值
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">verifyEquals</span>(Object actual, Object expected){
        <span class="hljs-keyword">try</span>{
            Assert.assertEquals(actual, expected);
        }<span class="hljs-keyword">catch</span>(Error e){
            errors.add(e);
            flag = <span class="hljs-keyword">false</span>;
        }
    }


    <span class="hljs-javadoc">/**
     * 验证值是否相等
     *<span class="hljs-javadoctag"> @param</span> actual 第一个值
     *<span class="hljs-javadoctag"> @param</span> expected 要对比的值
     *<span class="hljs-javadoctag"> @param</span> message 出错时候的提示消息
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">verifyEquals</span>(Object actual, Object expected, String message){
        <span class="hljs-keyword">try</span>{
            Assert.assertEquals(actual, expected, message);
        }<span class="hljs-keyword">catch</span>(Error e){
            errors.add(e);
            flag = <span class="hljs-keyword">false</span>;
        }
    }
}
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li></ul>

2.AssertionListener.java

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> com.example.base;

<span class="hljs-keyword">import</span> org.testng.ITestResult;
<span class="hljs-keyword">import</span> org.testng.TestListenerAdapter;

<span class="hljs-keyword">import</span> java.util.ArrayList;
<span class="hljs-keyword">import</span> java.util.Arrays;
<span class="hljs-keyword">import</span> java.util.List;

<span class="hljs-keyword">import</span> <span class="hljs-keyword">static</span> javafx.scene.input.KeyCode.T;

<span class="hljs-javadoc">/**
 * Created by LITP on 2016/9/21.
 */</span>

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AssertionListener</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">TestListenerAdapter</span> {</span>

    <span class="hljs-javadoc">/**
     * 测试方法开始的时候回调
     *<span class="hljs-javadoctag"> @param</span> result
     */</span>
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onTestStart</span>(ITestResult result) {
        Assertion.flag = <span class="hljs-keyword">true</span>;
        Assertion.errors.clear();
    }


    <span class="hljs-javadoc">/**
     * 测试终止时候回调
     *<span class="hljs-javadoctag"> @param</span> tr
     */</span>
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onTestFailure</span>(ITestResult tr) {
        <span class="hljs-keyword">this</span>.handleAssertion(tr);
    }


    <span class="hljs-javadoc">/**
     * Test跳过 的时候执行
     *<span class="hljs-javadoctag"> @param</span> tr
     */</span>
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onTestSkipped</span>(ITestResult tr) {
        <span class="hljs-keyword">this</span>.handleAssertion(tr);
    }

    <span class="hljs-javadoc">/**
     * Test运行完毕时候执行
     *<span class="hljs-javadoctag"> @param</span> tr
     */</span>
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onTestSuccess</span>(ITestResult tr) {
        <span class="hljs-keyword">this</span>.handleAssertion(tr);
    }

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> index = <span class="hljs-number">0</span>;    <span class="hljs-comment">//错误行号</span>


    <span class="hljs-javadoc">/**
     * 处理断言,每个Test执行完毕回调
     *<span class="hljs-javadoctag"> @param</span> tr 测试结果
     */</span>
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">handleAssertion</span>(ITestResult tr){
        <span class="hljs-keyword">if</span>(!Assertion.flag){  <span class="hljs-comment">//为假,就是断言出错了就执行下面的</span>
            <span class="hljs-comment">//获取异常</span>
            Throwable throwable = tr.getThrowable();
            <span class="hljs-keyword">if</span>(throwable==<span class="hljs-keyword">null</span>){
                throwable = <span class="hljs-keyword">new</span> Throwable();
            }
            <span class="hljs-comment">//获取异常堆栈信息</span>
            StackTraceElement[] traces = throwable.getStackTrace();

            <span class="hljs-comment">//创建要输出的所有堆栈信息</span>
            StackTraceElement[] alltrace = <span class="hljs-keyword">new</span> StackTraceElement[<span class="hljs-number">0</span>];

            <span class="hljs-comment">//循环获取断言的异常信息,</span>
            <span class="hljs-keyword">for</span> (Error e : Assertion.errors) {
                <span class="hljs-comment">//获取错误的堆栈数组信息</span>
                StackTraceElement[] errorTraces = e.getStackTrace();
                <span class="hljs-comment">//</span>
                StackTraceElement[] et = getKeyStackTrace(tr, errorTraces);
                <span class="hljs-comment">//设置异常信息堆栈内容</span>
                StackTraceElement[] message = handleMess(e.getMessage(),tr);

                <span class="hljs-comment">//行号初始化为0</span>
                index = <span class="hljs-number">0</span>;
                <span class="hljs-comment">//堆栈信息合并</span>
                alltrace = merge(alltrace, message);
                alltrace = merge(alltrace, et);
            }

            <span class="hljs-comment">//如果异常信息不为空</span>
            <span class="hljs-keyword">if</span>(traces!=<span class="hljs-keyword">null</span>){
                traces = getKeyStackTrace(tr, traces);
                alltrace = merge(alltrace, traces);
            }

            <span class="hljs-comment">//保存异常信息</span>
            throwable.setStackTrace(alltrace);
            tr.setThrowable(throwable);

            <span class="hljs-comment">//清空</span>
            Assertion.flag = <span class="hljs-keyword">true</span>;
            Assertion.errors.clear();

            <span class="hljs-comment">//输出异常信息</span>
            tr.setStatus(ITestResult.FAILURE);
        }
    }


    <span class="hljs-javadoc">/**
     * 获取堆栈信息
     *<span class="hljs-javadoctag"> @param</span> tr
     *<span class="hljs-javadoctag"> @param</span> stackTraceElements
     *<span class="hljs-javadoctag"> @return</span>
     */</span>
    <span class="hljs-keyword">private</span> StackTraceElement[] <span class="hljs-title">getKeyStackTrace</span>(ITestResult tr, StackTraceElement[] stackTraceElements){

        List<StackTraceElement> ets = <span class="hljs-keyword">new</span> ArrayList<>();
        <span class="hljs-comment">//循环获取信息</span>
        <span class="hljs-keyword">for</span> (StackTraceElement stackTraceElement : stackTraceElements) {
            <span class="hljs-comment">//返回测试类的堆栈信息</span>
            <span class="hljs-keyword">if</span>(stackTraceElement.getClassName().equals(tr.getTestClass().getName())){
                ets.add(stackTraceElement);
                index = stackTraceElement.getLineNumber();  <span class="hljs-comment">//错误行号</span>
            }
        }
        <span class="hljs-keyword">return</span> ets.toArray(<span class="hljs-keyword">new</span> StackTraceElement[ets.size()]);

    }

    <span class="hljs-javadoc">/**
     * 合并两个堆栈信息
     *<span class="hljs-javadoctag"> @param</span> traces1 第一个
     *<span class="hljs-javadoctag"> @param</span> traces2
     *<span class="hljs-javadoctag"> @return</span>
     */</span>
    <span class="hljs-keyword">private</span> StackTraceElement[] <span class="hljs-title">merge</span>(StackTraceElement[] traces1, StackTraceElement[] traces2){

        StackTraceElement[] result = Arrays.copyOf(traces1, traces1.length + traces2.length);
        System.arraycopy(traces2, <span class="hljs-number">0</span>, result, traces1.length, traces2.length);
        <span class="hljs-keyword">return</span> result;
    }

    <span class="hljs-javadoc">/**
     * 处理消息提示内容
     *<span class="hljs-javadoctag"> @param</span> mess 报错信息
     *<span class="hljs-javadoctag"> @param</span> tr 结果描述
     *<span class="hljs-javadoctag"> @return</span>
     */</span>
    <span class="hljs-keyword">private</span> StackTraceElement[] <span class="hljs-title">handleMess</span>(String mess,ITestResult tr){
        String message = <span class="hljs-string">"\n报错信息: "</span>+mess;
        String method = <span class="hljs-string">"\n报错方法名:"</span>+tr.getMethod().getMethodName();
        String className = <span class="hljs-string">"\n报错类:"</span>+tr.getTestClass().getRealClass().getSimpleName();
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> StackTraceElement[]{
                <span class="hljs-keyword">new</span> StackTraceElement(message,  <span class="hljs-comment">//内容</span>
                        method,                         <span class="hljs-comment">//方法名</span>
                        className+<span class="hljs-string">"\n报错行号"</span>,       <span class="hljs-comment">//文件名</span>
                        index)};
    }
}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li><li>117</li><li>118</li><li>119</li><li>120</li><li>121</li><li>122</li><li>123</li><li>124</li><li>125</li><li>126</li><li>127</li><li>128</li><li>129</li><li>130</li><li>131</li><li>132</li><li>133</li><li>134</li><li>135</li><li>136</li><li>137</li><li>138</li><li>139</li><li>140</li><li>141</li><li>142</li><li>143</li><li>144</li><li>145</li><li>146</li><li>147</li><li>148</li><li>149</li><li>150</li><li>151</li><li>152</li><li>153</li><li>154</li><li>155</li><li>156</li><li>157</li><li>158</li><li>159</li><li>160</li><li>161</li><li>162</li><li>163</li></ul>

四、Appium java的封装

1. Builder.java

构建器,在每个用例上都可以很方便设置app的属性

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> com.example.base;

<span class="hljs-javadoc">/**
 * Created by LITP on 2016/9/7.
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Builder</span> {</span>
    String deviceName = BaseAppium.deviceName;
    String platformVersion = BaseAppium.platformVersion;
    String path = System.getProperty(<span class="hljs-string">"user.dir"</span>) + <span class="hljs-string">"/src/main/java/apps/"</span>;
    String appPath = BaseAppium.appPath;
    String appPackage = BaseAppium.appPackage;
    String noReset = BaseAppium.noReset;
    String noSign = BaseAppium.noSign;
    String unicodeKeyboard = BaseAppium.unicodeKeyboard;
    String resetKeyboard = BaseAppium.resetKeyboard;
    String appActivity = BaseAppium.appActivity;

    <span class="hljs-keyword">public</span> Builder <span class="hljs-title">setAppPath</span>(String appPath) {
        <span class="hljs-keyword">this</span>.appPath = path + appPath;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    }

    <span class="hljs-keyword">public</span> Builder <span class="hljs-title">setDeviceName</span>(String deviceName) {
        <span class="hljs-keyword">this</span>.deviceName = deviceName;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    }

    <span class="hljs-keyword">public</span> Builder <span class="hljs-title">setPlatformVersion</span>(String platformVersion) {
        <span class="hljs-keyword">this</span>.platformVersion = platformVersion;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    }

    <span class="hljs-keyword">public</span> Builder <span class="hljs-title">setApp</span>(String appPath) {
        <span class="hljs-keyword">this</span>.appPath = appPath;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    }

    <span class="hljs-keyword">public</span> Builder <span class="hljs-title">setAppPackage</span>(String appPackage) {
        <span class="hljs-keyword">this</span>.appPackage = appPackage;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    }

    <span class="hljs-keyword">public</span> Builder <span class="hljs-title">setNoReset</span>(String noReset) {
        <span class="hljs-keyword">this</span>.noReset = noReset;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    }

    <span class="hljs-keyword">public</span> Builder <span class="hljs-title">setNoSign</span>(String noSign) {
        <span class="hljs-keyword">this</span>.noSign = noSign;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    }

    <span class="hljs-keyword">public</span> Builder <span class="hljs-title">setUnicodeKeyboard</span>(String unicodeKeyboard) {
        <span class="hljs-keyword">this</span>.unicodeKeyboard = unicodeKeyboard;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    }


    <span class="hljs-keyword">public</span> Builder <span class="hljs-title">setResetKeyboard</span>(String resetKeyboard) {
        <span class="hljs-keyword">this</span>.resetKeyboard = resetKeyboard;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    }

    <span class="hljs-keyword">public</span> Builder <span class="hljs-title">setAppActivity</span>(String appActivity) {
        <span class="hljs-keyword">this</span>.appActivity = appActivity;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    }

    <span class="hljs-keyword">public</span> BaseAppium <span class="hljs-title">build</span>() {
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> BaseAppium(<span class="hljs-keyword">this</span>);
    }
}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li></ul>

2. BaseAppium.java

父类,里面封装了一堆方法,只管用,传id、name那些就行了。当然这只是一部分,仅供参考,可以自己修改添加。这个封装没有利用po模式,仅供参考,接下来的文章继续优化封装。

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> com.example.base;


<span class="hljs-keyword">import</span> org.apache.http.util.TextUtils;
<span class="hljs-keyword">import</span> org.openqa.selenium.By;
<span class="hljs-keyword">import</span> org.openqa.selenium.NoSuchElementException;
<span class="hljs-keyword">import</span> org.openqa.selenium.TimeoutException;
<span class="hljs-keyword">import</span> org.openqa.selenium.remote.DesiredCapabilities;
<span class="hljs-keyword">import</span> org.testng.Assert;
<span class="hljs-keyword">import</span> org.testng.annotations.AfterTest;
<span class="hljs-keyword">import</span> org.testng.annotations.BeforeSuite;
<span class="hljs-keyword">import</span> org.testng.annotations.Listeners;

<span class="hljs-keyword">import</span> java.io.File;
<span class="hljs-keyword">import</span> java.net.MalformedURLException;
<span class="hljs-keyword">import</span> java.net.URL;
<span class="hljs-keyword">import</span> java.util.List;
<span class="hljs-keyword">import</span> java.util.concurrent.TimeUnit;

<span class="hljs-keyword">import</span> io.appium.java_client.MultiTouchAction;
<span class="hljs-keyword">import</span> io.appium.java_client.TouchAction;
<span class="hljs-keyword">import</span> io.appium.java_client.android.AndroidDriver;
<span class="hljs-keyword">import</span> io.appium.java_client.android.AndroidElement;

<span class="hljs-javadoc">/**
 * Created by LITP on 2016/9/7.
 */</span>
<span class="hljs-annotation">@Listeners</span>({com.example.base.AssertionListener.class})
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">BaseAppium</span> {</span>
    <span class="hljs-comment">//调试设备名字</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String deviceName = <span class="hljs-string">"minote"</span>;
    <span class="hljs-comment">//调试设备系统版本</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String platformVersion = <span class="hljs-string">"4.4.2"</span>;
    <span class="hljs-comment">//app路径</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String appPath = System.getProperty(<span class="hljs-string">"user.dir"</span>) + <span class="hljs-string">"/src/main/java/apps/shouhu2.2.3.apk"</span>;

    <span class="hljs-comment">//包名</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String appPackage = <span class="hljs-string">"com.minstone.mdoctor"</span>;

    <span class="hljs-comment">//是否需要重新安装</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String noReset = <span class="hljs-string">"True"</span>;

    <span class="hljs-comment">//是否不重新签名</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String noSign = <span class="hljs-string">"True"</span>;

    <span class="hljs-comment">//是否使用unicode输入法,真是支持中文</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String unicodeKeyboard = <span class="hljs-string">"True"</span>;

    <span class="hljs-comment">//是否祸福默认呢输入法</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String resetKeyboard = <span class="hljs-string">"True"</span>;

    <span class="hljs-comment">//要启动的Activity</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String appActivity = appPackage + <span class="hljs-string">".activity.login.WelcomeActivity"</span>;

    <span class="hljs-keyword">public</span> AndroidDriver<AndroidElement> driver = <span class="hljs-keyword">null</span>;


    <span class="hljs-comment">//单个触摸操作类</span>
    TouchAction touchAction;

    <span class="hljs-comment">//多个触摸操作时间</span>
    MultiTouchAction multiTouchAction;

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> WAIT_TIME = <span class="hljs-number">10</span>;    <span class="hljs-comment">//默认的等待控件时间</span>
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> SWIPE_DEFAULT_PERCENT = <span class="hljs-number">5</span>;    <span class="hljs-comment">//默认滑动比例</span>


    <span class="hljs-comment">//构造方法</span>
    <span class="hljs-keyword">public</span> <span class="hljs-title">BaseAppium</span>() {
        <span class="hljs-keyword">this</span>(<span class="hljs-keyword">new</span> Builder());
    }

    <span class="hljs-keyword">public</span> <span class="hljs-title">BaseAppium</span>(Builder builder) {
        print(<span class="hljs-string">"基类初始化!"</span>);
        appActivity = builder.appActivity;
        appPackage = builder.appPackage;
        appPath = builder.appPath;
        deviceName = builder.deviceName;
        noReset = builder.noReset;
        noSign = builder.noSign;
        unicodeKeyboard = builder.unicodeKeyboard;
        resetKeyboard = builder.resetKeyboard;
    }


    <span class="hljs-javadoc">/**
     * appium启动参数
     *
     *<span class="hljs-javadoctag"> @throws</span> MalformedURLException
     */</span>
    <span class="hljs-annotation">@BeforeSuite</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">beforeSuite</span>() <span class="hljs-keyword">throws</span> MalformedURLException {


        DesiredCapabilities capabilities = <span class="hljs-keyword">new</span> DesiredCapabilities();

        capabilities.setCapability(<span class="hljs-string">"deviceName"</span>, deviceName);
        capabilities.setCapability(<span class="hljs-string">"platformVersion"</span>, platformVersion);
        capabilities.setCapability(<span class="hljs-string">"app"</span>, <span class="hljs-keyword">new</span> File(appPath).getAbsolutePath());
        capabilities.setCapability(<span class="hljs-string">"appPackage"</span>, appPackage);
        <span class="hljs-comment">//支持中文</span>
        capabilities.setCapability(<span class="hljs-string">"unicodeKeyboard"</span>, unicodeKeyboard);
        <span class="hljs-comment">//运行完毕之后,变回系统的输入法</span>
        capabilities.setCapability(<span class="hljs-string">"resetKeyboard"</span>, resetKeyboard);
        <span class="hljs-comment">//不重复安装</span>
        capabilities.setCapability(<span class="hljs-string">"noReset"</span>, noReset);
        <span class="hljs-comment">//不重新签名</span>
        capabilities.setCapability(<span class="hljs-string">"noSign"</span>, noSign);
        <span class="hljs-comment">//打开的activity</span>
        capabilities.setCapability(<span class="hljs-string">"appActivity"</span>, appActivity);
        <span class="hljs-comment">//启动Driver</span>
        driver = <span class="hljs-keyword">new</span> AndroidDriver<>(<span class="hljs-keyword">new</span> URL(<span class="hljs-string">"http://127.0.0.1:4723/wd/hub"</span>), capabilities);

    }


    <span class="hljs-annotation">@AfterTest</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">afterTest</span>() {
        <span class="hljs-comment">//结束这次测试</span>
        driver.quit();
    }


    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isIdElementExist</span>(String id) {
        <span class="hljs-keyword">return</span> isIdElementExist(id, <span class="hljs-keyword">false</span>);
    }

    <span class="hljs-javadoc">/**
     * 根据id判断当前界面是否存在并显示这个控件
     *
     *<span class="hljs-javadoctag"> @param</span> id     要查找的id
     *<span class="hljs-javadoctag"> @param</span> isShow 是否判断控件显示
     *<span class="hljs-javadoctag"> @return</span> 返回对应的控件
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isIdElementExist</span>(String id, <span class="hljs-keyword">boolean</span> isShow) {
        AndroidElement ae;
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">if</span> (driver != <span class="hljs-keyword">null</span>) {
                ae = driver.findElementById(appPackage + <span class="hljs-string">":id/"</span> + id);
                <span class="hljs-keyword">if</span> (isShow) {
                    <span class="hljs-keyword">return</span> ae.isDisplayed();
                } <span class="hljs-keyword">else</span> {
                    <span class="hljs-keyword">return</span> ae != <span class="hljs-keyword">null</span>;
                }
            } <span class="hljs-keyword">else</span> {
                print(<span class="hljs-string">"driver为空"</span>);
            }
        } <span class="hljs-keyword">catch</span> (NoSuchElementException e) {
            print(<span class="hljs-string">"找不到控件"</span> + e.getMessage());
        }

        <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;

    }

    <span class="hljs-javadoc">/**
     * 选择当前界面的有这个文字的控件
     *
     *<span class="hljs-javadoctag"> @param</span> name
     *<span class="hljs-javadoctag"> @param</span> hasShow 是否显示
     *<span class="hljs-javadoctag"> @return</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isNameElementExist</span>(String name, <span class="hljs-keyword">boolean</span> hasShow) {
        <span class="hljs-keyword">try</span> {
            AndroidElement ae = driver.findElement(By.name(name));
            <span class="hljs-keyword">if</span> (hasShow) {
                <span class="hljs-keyword">return</span> ae.isDisplayed();
            } <span class="hljs-keyword">else</span> <span class="hljs-keyword">return</span> ae != <span class="hljs-keyword">null</span>;
        } <span class="hljs-keyword">catch</span> (NoSuchElementException e) {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
        }


    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isNameElementExist</span>(String name) {
        <span class="hljs-keyword">return</span> isNameElementExist(name, <span class="hljs-keyword">false</span>);
    }


    <span class="hljs-javadoc">/**
     * 判断控件时候存在
     *
     *<span class="hljs-javadoctag"> @param</span> by      By
     *<span class="hljs-javadoctag"> @param</span> timeout 等待的事件
     *<span class="hljs-javadoctag"> @return</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isElementExist</span>(By by, <span class="hljs-keyword">int</span> timeout) {
        <span class="hljs-keyword">try</span> {
            waitAuto(by, timeout);
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
        } <span class="hljs-keyword">catch</span> (Exception e) {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
        }
    }


    <span class="hljs-javadoc">/**
     * 根据id获取当前界面的一个控件
     *
     *<span class="hljs-javadoctag"> @param</span> id 要查找的id
     *<span class="hljs-javadoctag"> @return</span> 返回对应的控件
     */</span>
    <span class="hljs-keyword">public</span> AndroidElement <span class="hljs-title">findById</span>(String id) {
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">if</span> (driver != <span class="hljs-keyword">null</span>) {
                <span class="hljs-keyword">return</span> driver.findElementById(appPackage + <span class="hljs-string">":id/"</span> + id);
            } <span class="hljs-keyword">else</span> {
                print(<span class="hljs-string">"driver为空"</span>);
            }
        } <span class="hljs-keyword">catch</span> (NoSuchElementException e) {
            print(<span class="hljs-string">"找不到控件"</span> + e.getMessage());
        } 
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
    }


    <span class="hljs-javadoc">/**
     * 选择当前界面的有这个文字的控件
     *
     *<span class="hljs-javadoctag"> @param</span> name 内容
     *<span class="hljs-javadoctag"> @return</span> 找到的控件
     */</span>
    <span class="hljs-keyword">public</span> AndroidElement <span class="hljs-title">findByName</span>(String name) {
        <span class="hljs-keyword">return</span> driver.findElement(By.name(name));
    }


    <span class="hljs-javadoc">/**
     * 根据id获取当前界面的一个控件
     *
     *<span class="hljs-javadoctag"> @param</span> name 要查找的控件的类名
     *<span class="hljs-javadoctag"> @return</span> 返回对应的控件
     */</span>
    <span class="hljs-keyword">public</span> AndroidElement <span class="hljs-title">findByClassName</span>(String name) {
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">if</span> (driver != <span class="hljs-keyword">null</span>) {
                <span class="hljs-keyword">return</span> driver.findElementByClassName(name);
            } <span class="hljs-keyword">else</span> {
                print(<span class="hljs-string">"dricer为空"</span>);
            }
        } <span class="hljs-keyword">catch</span> (NoSuchElementException e) {
            print(<span class="hljs-string">"找不到控件"</span> + e.getMessage());
        } 
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
    }

    <span class="hljs-javadoc">/**
     * 打印字符
     *
     *<span class="hljs-javadoctag"> @param</span> str 要打印的字符
     */</span>
    <span class="hljs-keyword">public</span> <T> <span class="hljs-keyword">void</span> <span class="hljs-title">print</span>(T str) {
        <span class="hljs-keyword">if</span> (!TextUtils.isEmpty(String.valueOf(str))) {
            System.out.println(str);
        } <span class="hljs-keyword">else</span> {
            System.out.println(<span class="hljs-string">"输出了空字符"</span>);
        }
    }

    <span class="hljs-javadoc">/**
     * Click点击空格键
     *
     *<span class="hljs-javadoctag"> @param</span> ae 要点击的控件
     *<span class="hljs-javadoctag"> @return</span> 返回是否点击
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">clickView</span>(AndroidElement ae) {
        <span class="hljs-keyword">return</span> clickView(ae, <span class="hljs-string">""</span>);
    }


    <span class="hljs-javadoc">/**
     * Click点击控件
     *
     *<span class="hljs-javadoctag"> @param</span> ae  控件
     *<span class="hljs-javadoctag"> @param</span> str 控件的文字描述,供错误时候输出
     *<span class="hljs-javadoctag"> @return</span> 返回是否存在控件
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">clickView</span>(AndroidElement ae, String str) {
        <span class="hljs-keyword">if</span> (ae != <span class="hljs-keyword">null</span>) {
            ae.click();
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
        } <span class="hljs-keyword">else</span> {
            print(str + <span class="hljs-string">"为空,点击错误"</span>);
        }
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
    }

    <span class="hljs-javadoc">/**
     * Click点击指定id的View
     *
     *<span class="hljs-javadoctag"> @param</span> id 要点击的控件的id
     *<span class="hljs-javadoctag"> @return</span> 点击了返回真
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">clickView</span>(String id) {
        AndroidElement ae = findById(id);
        <span class="hljs-keyword">if</span> (ae != <span class="hljs-keyword">null</span>) {
            ae.click();
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
        } <span class="hljs-keyword">else</span> {
            print(id + <span class="hljs-string">"为空,点击错误"</span>);
        }
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
    }


    <span class="hljs-javadoc">/**
     * 线程休眠秒数,单位秒
     *
     *<span class="hljs-javadoctag"> @param</span> s 要休眠的秒数
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sleep</span>(<span class="hljs-keyword">long</span> s) <span class="hljs-keyword">throws</span> InterruptedException {
        Thread.sleep(s);
    }


    <span class="hljs-javadoc">/**
     * 获取触摸实例
     *
     *<span class="hljs-javadoctag"> @return</span>
     */</span>
    <span class="hljs-keyword">public</span> TouchAction <span class="hljs-title">getTouch</span>() {
        <span class="hljs-keyword">if</span> (driver == <span class="hljs-keyword">null</span>) {
            print(<span class="hljs-string">"单点触摸时候driver为空"</span>);
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
        } <span class="hljs-keyword">else</span> {
            <span class="hljs-keyword">if</span> (touchAction == <span class="hljs-keyword">null</span>) {
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> TouchAction(driver);
            } <span class="hljs-keyword">else</span> {
                <span class="hljs-keyword">return</span> touchAction;
            }

        }
    }


    <span class="hljs-javadoc">/**
     * 获取多点触摸实例
     *
     *<span class="hljs-javadoctag"> @return</span>
     */</span>
    <span class="hljs-keyword">public</span> MultiTouchAction <span class="hljs-title">getMultiTouch</span>() {
        <span class="hljs-keyword">if</span> (driver == <span class="hljs-keyword">null</span>) {
            print(<span class="hljs-string">"多点触摸时候driver为空"</span>);
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
        } <span class="hljs-keyword">else</span> {
            <span class="hljs-keyword">if</span> (multiTouchAction == <span class="hljs-keyword">null</span>) {
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> MultiTouchAction(driver);
            } <span class="hljs-keyword">else</span> {
                <span class="hljs-keyword">return</span> multiTouchAction;
            }

        }
    }

    <span class="hljs-javadoc">/**
     * 往控件输入字符串
     *
     *<span class="hljs-javadoctag"> @param</span> ae  要输入的控件
     *<span class="hljs-javadoctag"> @param</span> str 要输入的字符串
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">input</span>(AndroidElement ae, String str) {
        <span class="hljs-keyword">if</span> (ae == <span class="hljs-keyword">null</span>) {
            print(<span class="hljs-string">"控件为空,输入内容失败:"</span> + str);
        } <span class="hljs-keyword">else</span> {
            ae.sendKeys(str);
        }

    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swipeToUp</span>(<span class="hljs-keyword">int</span> during){
        swipeToUp(during,SWIPE_DEFAULT_PERCENT);
    }
    <span class="hljs-javadoc">/**
     * 向上滑动,
     *
     *<span class="hljs-javadoctag"> @param</span> during
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swipeToUp</span>(<span class="hljs-keyword">int</span> during,<span class="hljs-keyword">int</span> percent) {
        <span class="hljs-keyword">int</span> width = getScreenWidth();
        <span class="hljs-keyword">int</span> height = getScreenHeight();
        driver.swipe(width / <span class="hljs-number">2</span>, height * (percent - <span class="hljs-number">1</span>) / percent, width / <span class="hljs-number">2</span>, height / percent, during);
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swipeToDown</span>(<span class="hljs-keyword">int</span> during){
        swipeToDown(during,SWIPE_DEFAULT_PERCENT);
    }

    <span class="hljs-javadoc">/**
     * 向下滑动,
     *
     *<span class="hljs-javadoctag"> @param</span> during 滑动时间
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swipeToDown</span>(<span class="hljs-keyword">int</span> during,<span class="hljs-keyword">int</span> percent) {
        <span class="hljs-keyword">int</span> width = getScreenWidth();
        <span class="hljs-keyword">int</span> height = getScreenHeight();
        driver.swipe(width / <span class="hljs-number">2</span>, height / percent, width / <span class="hljs-number">2</span>, height * (percent - <span class="hljs-number">1</span>) / percent, during);
    }


    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swipeToLeft</span>(<span class="hljs-keyword">int</span> during){
        swipeToLeft(during,SWIPE_DEFAULT_PERCENT);
    }

    <span class="hljs-javadoc">/**
     * 向左滑动,
     *
     *<span class="hljs-javadoctag"> @param</span> during  滑动时间
     *<span class="hljs-javadoctag"> @param</span> percent 位置的百分比,2-10, 例如3就是 从2/3滑到1/3
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swipeToLeft</span>(<span class="hljs-keyword">int</span> during, <span class="hljs-keyword">int</span> percent) {
        <span class="hljs-keyword">int</span> width = getScreenWidth();
        <span class="hljs-keyword">int</span> height = getScreenHeight();
        driver.swipe(width * (percent - <span class="hljs-number">1</span>) / percent, height / <span class="hljs-number">2</span>, width / percent, height / <span class="hljs-number">2</span>, during);
    }


    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swipeToRight</span>(<span class="hljs-keyword">int</span> during) {
        swipeToRight(during, SWIPE_DEFAULT_PERCENT);
    }

    <span class="hljs-javadoc">/**
     * 向右滑动,
     *
     *<span class="hljs-javadoctag"> @param</span> during  滑动时间
     *<span class="hljs-javadoctag"> @param</span> percent 位置的百分比,2-10, 例如3就是 从1/3滑到2/3
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swipeToRight</span>(<span class="hljs-keyword">int</span> during, <span class="hljs-keyword">int</span> percent) {
        <span class="hljs-keyword">int</span> width = getScreenWidth();
        <span class="hljs-keyword">int</span> height = getScreenHeight();
        driver.swipe(width / percent, height / <span class="hljs-number">2</span>, width * (percent - <span class="hljs-number">1</span>) / percent, height / <span class="hljs-number">2</span>, during);
    }


    <span class="hljs-javadoc">/**
     * 显示等待,等待Id对应的控件出现time秒,一出现马上返回,time秒不出现也返回
     */</span>
    <span class="hljs-keyword">public</span> AndroidElement <span class="hljs-title">waitAuto</span>(By by, <span class="hljs-keyword">int</span> time) {
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> AndroidDriverWait(driver, time * <span class="hljs-number">1000</span>)
                    .until(<span class="hljs-keyword">new</span> ExpectedCondition<AndroidElement>() {
                        <span class="hljs-annotation">@Override</span>
                        <span class="hljs-keyword">public</span> AndroidElement <span class="hljs-title">apply</span>(AndroidDriver androidDriver) {
                            <span class="hljs-keyword">return</span> (AndroidElement) androidDriver.findElement(by);
                        }
                    });
        } <span class="hljs-keyword">catch</span> (TimeoutException e) {
            Assert.fail(<span class="hljs-string">"查找元素超时!! "</span> + time + <span class="hljs-string">" 秒之后还没找到元素 ["</span> + by.toString() + <span class="hljs-string">"]"</span>, e);
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
        }
    }

    <span class="hljs-keyword">public</span> AndroidElement <span class="hljs-title">waitAutoById</span>(String id) {
        <span class="hljs-keyword">return</span> waitAutoById(id, WAIT_TIME);
    }

    <span class="hljs-keyword">public</span> AndroidElement <span class="hljs-title">waitAutoById</span>(String id, <span class="hljs-keyword">int</span> time) {
        <span class="hljs-keyword">return</span> waitAuto(By.id(id), time);
    }

    <span class="hljs-keyword">public</span> AndroidElement <span class="hljs-title">waitAutoByName</span>(String name) {
        <span class="hljs-keyword">return</span> waitAutoByName(name, WAIT_TIME);
    }

    <span class="hljs-keyword">public</span> AndroidElement <span class="hljs-title">waitAutoByName</span>(String name, <span class="hljs-keyword">int</span> time) {
        <span class="hljs-keyword">return</span> waitAuto(By.name(name), time);
    }


    <span class="hljs-keyword">public</span> AndroidElement <span class="hljs-title">waitAutoByXp</span>(String xPath) {
        <span class="hljs-keyword">return</span> waitAutoByXp(xPath, WAIT_TIME);
    }

    <span class="hljs-keyword">public</span> AndroidElement <span class="hljs-title">waitAutoByXp</span>(String xPath, <span class="hljs-keyword">int</span> time) {
        <span class="hljs-keyword">return</span> waitAuto(By.xpath(xPath), time);
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">waitAuto</span>() {
        waitAuto(WAIT_TIME);
    }

    <span class="hljs-javadoc">/**
     * ,隐式等待,如果在指定时间内还是找不到下个元素则会报错停止脚本
     * 全局设定的,find控件找不到就会按照这个事件来等待
     *
     *<span class="hljs-javadoctag"> @param</span> time 要等待的时间
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">waitAuto</span>(<span class="hljs-keyword">int</span> time) {
        driver.manage().timeouts().implicitlyWait(time, TimeUnit.SECONDS);
    }

    <span class="hljs-javadoc">/**
     * 打开Activity
     *
     *<span class="hljs-javadoctag"> @param</span> activityName activity的名字
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">startActivity</span>(String activityName) {
        driver.startActivity(appPackage, activityName);
    }


    <span class="hljs-javadoc">/**
     * 获取当前的activity,返回文件名
     *
     *<span class="hljs-javadoctag"> @return</span>
     */</span>
    <span class="hljs-keyword">public</span> String <span class="hljs-title">getCurrActivity</span>() {
        String str = driver.currentActivity();
        <span class="hljs-keyword">return</span> str.substring(str.lastIndexOf(<span class="hljs-string">"."</span>) + <span class="hljs-number">1</span>);
    }


    <span class="hljs-javadoc">/**
     * 获取当前界面的所有EditText,并依次输入内容
     *
     *<span class="hljs-javadoctag"> @param</span> str 要输入的数组
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">inputManyText</span>(String... str) {
        List<AndroidElement> textFieldsList = driver.findElementsByClassName(<span class="hljs-string">"android.widget.EditText"</span>);
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < str.length; i++) {
            textFieldsList.get(i).sendKeys(str[i]);
            <span class="hljs-comment">//textFieldsList.get(i).setValue(str[i]);</span>

        }
    }


    <span class="hljs-javadoc">/**
     * 点击某个控件
     *
     *<span class="hljs-javadoctag"> @param</span> ae 要点击的控件
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">press</span>(AndroidElement ae) {
        <span class="hljs-keyword">try</span> {
            getTouch().tap(ae).perform();
        } <span class="hljs-keyword">catch</span> (Exception e) {
            print(<span class="hljs-string">"tab点击元素错误"</span> + e.getMessage());
            e.printStackTrace();
        }
    }


    <span class="hljs-javadoc">/**
     * 点击某个坐标
     *
     *<span class="hljs-javadoctag"> @param</span> x
     *<span class="hljs-javadoctag"> @param</span> y
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">press</span>(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y) {
        <span class="hljs-keyword">try</span> {
            getTouch().tap(x, y).perform();
        } <span class="hljs-keyword">catch</span> (Exception e) {
            print(<span class="hljs-string">"tab点击元素错误"</span> + e.getMessage());
            e.printStackTrace();
        }
    }


    <span class="hljs-javadoc">/**
     * 长按某个控件
     *
     *<span class="hljs-javadoctag"> @param</span> ae 要点击的控件
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">longPress</span>(AndroidElement ae) {
        <span class="hljs-keyword">try</span> {
            getTouch().longPress(ae).release().perform();
        } <span class="hljs-keyword">catch</span> (Exception e) {
            print(<span class="hljs-string">"长按点击元素错误"</span> + e.getMessage());
            e.printStackTrace();
        }
    }


    <span class="hljs-javadoc">/**
     * 长按某个坐标
     *
     *<span class="hljs-javadoctag"> @param</span> x
     *<span class="hljs-javadoctag"> @param</span> y
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">longPress</span>(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y) {
        <span class="hljs-keyword">try</span> {
            getTouch().longPress(x, y).release().perform();
        } <span class="hljs-keyword">catch</span> (Exception e) {
            print(<span class="hljs-string">"长按点击元素错误"</span> + e.getMessage());
            e.printStackTrace();
        }
    }


    <span class="hljs-javadoc">/**
     * 在控件上滑动
     *
     *<span class="hljs-javadoctag"> @param</span> element   要滑动的控件
     *<span class="hljs-javadoctag"> @param</span> direction 方向,事件不设置默认1秒
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swipOnElement</span>(AndroidElement element, String direction) {
        swipOnElement(element, direction, <span class="hljs-number">1000</span>);  <span class="hljs-comment">//不设置时间就为2秒</span>
    }

    <span class="hljs-javadoc">/**
     * 在某一个控件上滑动
     *
     *<span class="hljs-javadoctag"> @param</span> element   在那个元素上滑动
     *<span class="hljs-javadoctag"> @param</span> direction 方向,UP  DOWN LEFT RIGHT
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swipOnElement</span>(AndroidElement element, String direction, <span class="hljs-keyword">int</span> duration) {
        <span class="hljs-comment">//获取元素的起初xy,在左上角</span>
        <span class="hljs-keyword">int</span> x = element.getLocation().getX();
        <span class="hljs-keyword">int</span> y = element.getLocation().getY();
        <span class="hljs-comment">//获取元素的宽高</span>
        <span class="hljs-keyword">int</span> width = element.getSize().getWidth();
        <span class="hljs-keyword">int</span> height = element.getSize().getHeight();

        <span class="hljs-keyword">switch</span> (direction) {
            <span class="hljs-keyword">case</span> <span class="hljs-string">"UP"</span>:
                <span class="hljs-keyword">int</span> startX = x + width / <span class="hljs-number">2</span>;
                <span class="hljs-comment">//在4/5的底部的中间向上滑动</span>
                driver.swipe(startX, y + height * <span class="hljs-number">4</span> / <span class="hljs-number">5</span>, startX, y + height / <span class="hljs-number">5</span>, duration);
                <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">case</span> <span class="hljs-string">"DOWN"</span>:
                startX = x + width / <span class="hljs-number">2</span>;
                <span class="hljs-comment">//在4/5的底部的中间向上滑动</span>
                driver.swipe(startX, y + height / <span class="hljs-number">5</span>, startX, y + height * <span class="hljs-number">4</span> / <span class="hljs-number">5</span>, duration);
                <span class="hljs-keyword">break</span>;

            <span class="hljs-keyword">case</span> <span class="hljs-string">"LEFT"</span>:
                <span class="hljs-keyword">int</span> startY = y + width / <span class="hljs-number">2</span>;
                driver.swipe(x + width * <span class="hljs-number">4</span> / <span class="hljs-number">5</span>, startY, x + width / <span class="hljs-number">5</span>, startY, duration);
                <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">case</span> <span class="hljs-string">"RIGHT"</span>:
                startY = y + width / <span class="hljs-number">2</span>;
                driver.swipe(x + width / <span class="hljs-number">5</span>, startY, x + width * <span class="hljs-number">4</span> / <span class="hljs-number">5</span>, startY, duration);
                <span class="hljs-keyword">break</span>;
        }
    }

    <span class="hljs-javadoc">/**
     * 在某个方向上滑动
     *
     *<span class="hljs-javadoctag"> @param</span> direction 方向,UP DOWN LEFT RIGHT
     *<span class="hljs-javadoctag"> @param</span> duration  持续时间
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swip</span>(String direction, <span class="hljs-keyword">int</span> duration) {
        <span class="hljs-keyword">switch</span> (direction) {
            <span class="hljs-keyword">case</span> <span class="hljs-string">"UP"</span>:
                swipeToUp(duration);
                <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">case</span> <span class="hljs-string">"DOWN"</span>:
                swipeToDown(duration);
                <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">case</span> <span class="hljs-string">"LEFT"</span>:
                swipeToLeft(duration);
                <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">case</span> <span class="hljs-string">"RIGHT"</span>:
                swipeToRight(duration);
                <span class="hljs-keyword">break</span>;
        }
    }


    <span class="hljs-javadoc">/**
     * 在指定次数的条件下,某个方向滑动,直到这个元素出现
     *
     *<span class="hljs-javadoctag"> @param</span> by         控件
     *<span class="hljs-javadoctag"> @param</span> direction  方向,UP DOWN  LEFT RIGHT
     *<span class="hljs-javadoctag"> @param</span> duration   滑动一次持续时间
     *<span class="hljs-javadoctag"> @param</span> maxSwipNum 最大滑动次数
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swipUtilElementAppear</span>(By by, String direction, <span class="hljs-keyword">int</span> duration, <span class="hljs-keyword">int</span> maxSwipNum) {
        <span class="hljs-keyword">int</span> i = maxSwipNum;
        Boolean flag = <span class="hljs-keyword">true</span>;
        <span class="hljs-keyword">while</span> (flag) {
            <span class="hljs-keyword">try</span> {
                <span class="hljs-keyword">if</span> (i <= <span class="hljs-number">0</span>) {
                    flag = <span class="hljs-keyword">false</span>;
                }
                driver.findElement(by);
                flag = <span class="hljs-keyword">false</span>;
            } <span class="hljs-keyword">catch</span> (Exception e) {
                i--;
                swip(direction, duration);
            }
        }
    }

    <span class="hljs-javadoc">/**
     * 在某个方向滑动直到这个元素出现
     *
     *<span class="hljs-javadoctag"> @param</span> by        控件
     *<span class="hljs-javadoctag"> @param</span> direction 方向,UP DOWN  LEFT RIGHT
     *<span class="hljs-javadoctag"> @param</span> duration  滑动一次持续时间
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swipUtilElementAppear</span>(By by, String direction, <span class="hljs-keyword">int</span> duration) {
        Boolean flag = <span class="hljs-keyword">true</span>;
        <span class="hljs-keyword">while</span> (flag) {
            <span class="hljs-keyword">try</span> {
                driver.findElement(by);
                flag = <span class="hljs-keyword">false</span>;
            } <span class="hljs-keyword">catch</span> (Exception e) {
                swip(direction, duration);
            }
        }
    }


    <span class="hljs-javadoc">/**
     * 获取屏幕的宽高
     *
     *<span class="hljs-javadoctag"> @return</span> 返回宽高的数组
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span>[] <span class="hljs-title">getScreen</span>() {
        <span class="hljs-keyword">int</span> width = driver.manage().window().getSize().getWidth();
        <span class="hljs-keyword">int</span> height = driver.manage().window().getSize().getHeight();
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[]{width, height};
    }

    <span class="hljs-javadoc">/**
     * 获取屏幕宽度
     *
     *<span class="hljs-javadoctag"> @return</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getScreenWidth</span>() {
        <span class="hljs-keyword">return</span> driver.manage().window().getSize().getWidth();
    }

    <span class="hljs-javadoc">/**
     * 获取屏幕高度
     *
     *<span class="hljs-javadoctag"> @return</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getScreenHeight</span>() {
        <span class="hljs-keyword">return</span> driver.manage().window().getSize().getHeight();
    }

    <span class="hljs-javadoc">/**
     * 逐字删除编辑框中的文字
     *<span class="hljs-javadoctag"> @param</span> element 文本框架控件
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">clearText</span>(AndroidElement element){
            String text = element.getText();
            <span class="hljs-comment">//跳到最后</span>
            driver.pressKeyCode(KEYCODE_MOVE_END);
            <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < text.length(); i ++){
                <span class="hljs-comment">//循环后退删除</span>
                driver.pressKeyCode(BACKSPACE);
            }


    }

}</code>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值