[Android測試] AS+Appium+Java+Win 自動化測試之六 Appium的Java測試腳本封裝

一、爲什麼需要封裝?

封裝的本意就是爲了方便、簡潔。

二、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>
發佈了12 篇原創文章 · 獲贊 8 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章