一、为什么需要封装?
封装的本意就是为了方便、简洁。
二、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>