一、爲什麼需要封裝?
封裝的本意就是爲了方便、簡潔。
二、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>