用了AppiumDriver后,WebDriverWait中无法使用AppiumDriver特有的方法,比如findElementsByAndroidUIAutomator等。这是由于
WebDriverWait继承与FluentWait<WebDriver>,而WebDriver接口是没有定义findElementsByAndroidUIAutomator的,所以如果想用类似WebDriverWait的功能,就必须做些封装。
<span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">merlini</span><span class="o">.</span><span class="na">app</span><span class="o">.</span><span class="na">common</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">io.appium.java_client.AppiumDriver</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.concurrent.TimeUnit</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.openqa.selenium.NotFoundException</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.openqa.selenium.support.ui.Clock</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.openqa.selenium.support.ui.FluentWait</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.openqa.selenium.support.ui.Sleeper</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.openqa.selenium.support.ui.SystemClock</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.openqa.selenium.support.ui.WebDriverWait</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.merlini.common.Config</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">AppiumDriverWait</span> <span class="kd">extends</span> <span class="n">FluentWait</span><span class="o"><</span><span class="n">AppiumDriver</span><span class="o">>{</span>
<span class="c1">//默认轮询时间(毫秒)</span>
<span class="kd">public</span> <span class="kd">final</span> <span class="kd">static</span> <span class="kt">long</span> <span class="n">DEFAULT_POLLINGEVERY_TIMEMILLS</span> <span class="o">=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">Config</span><span class="o">.</span><span class="na">getConfBykey</span><span class="o">(</span><span class="s">"wait.sleepInMillis"</span><span class="o">));</span>
<span class="kd">public</span> <span class="kd">final</span> <span class="kd">static</span> <span class="kt">long</span> <span class="n">DEFAULT_TIMEOUT_INSECONDS</span> <span class="o">=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">Config</span><span class="o">.</span><span class="na">getConfBykey</span><span class="o">(</span><span class="s">"wait.TimeOutInSeconds"</span><span class="o">));</span>
<span class="cm">/**
* Wait will ignore instances of NotFoundException that are encountered (thrown) by default in
* the 'until' condition, and immediately propagate all others. You can add more to the ignore
* list by calling ignoring(exceptions to add).
*
* @param driver The AppiumDriver instance to pass to the expected conditions
* @see WebDriverWait#ignoring(java.lang.Class)
*/</span>
<span class="kd">public</span> <span class="n">AppiumDriverWait</span><span class="o">(</span><span class="n">AppiumDriver</span> <span class="n">driver</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">(</span><span class="n">driver</span><span class="o">,</span> <span class="k">new</span> <span class="n">SystemClock</span><span class="o">(),</span> <span class="n">Sleeper</span><span class="o">.</span><span class="na">SYSTEM_SLEEPER</span><span class="o">,</span> <span class="n">DEFAULT_TIMEOUT_INSECONDS</span><span class="o">,</span> <span class="n">DEFAULT_POLLINGEVERY_TIMEMILLS</span><span class="o">);</span>
<span class="o">}</span>
<span class="cm">/**
* Wait will ignore instances of NotFoundException that are encountered (thrown) by default in
* the 'until' condition, and immediately propagate all others. You can add more to the ignore
* list by calling ignoring(exceptions to add).
*
* @param driver The AppiumDriver instance to pass to the expected conditions
* @param timeOutInSeconds The timeout in seconds when an expectation is called
* @see WebDriverWait#ignoring(java.lang.Class)
*/</span>
<span class="kd">public</span> <span class="n">AppiumDriverWait</span><span class="o">(</span><span class="n">AppiumDriver</span> <span class="n">driver</span><span class="o">,</span> <span class="kt">long</span> <span class="n">timeOutInSeconds</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">(</span><span class="n">driver</span><span class="o">,</span> <span class="k">new</span> <span class="n">SystemClock</span><span class="o">(),</span> <span class="n">Sleeper</span><span class="o">.</span><span class="na">SYSTEM_SLEEPER</span><span class="o">,</span> <span class="n">timeOutInSeconds</span><span class="o">,</span> <span class="n">DEFAULT_POLLINGEVERY_TIMEMILLS</span><span class="o">);</span>
<span class="o">}</span>
<span class="cm">/**
* Wait will ignore instances of NotFoundException that are encountered (thrown) by default in
* the 'until' condition, and immediately propagate all others. You can add more to the ignore
* list by calling ignoring(exceptions to add).
*
* @param driver The WebDriver instance to pass to the expected conditions
* @param timeOutInSeconds The timeout in seconds when an expectation is called
* @param sleepInMillis The duration in milliseconds to sleep between polls.
* @see WebDriverWait#ignoring(java.lang.Class)
*/</span>
<span class="kd">public</span> <span class="n">AppiumDriverWait</span><span class="o">(</span><span class="n">AppiumDriver</span> <span class="n">driver</span><span class="o">,</span> <span class="kt">long</span> <span class="n">timeOutInSeconds</span><span class="o">,</span> <span class="kt">long</span> <span class="n">sleepInMillis</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">(</span><span class="n">driver</span><span class="o">,</span> <span class="k">new</span> <span class="n">SystemClock</span><span class="o">(),</span> <span class="n">Sleeper</span><span class="o">.</span><span class="na">SYSTEM_SLEEPER</span><span class="o">,</span> <span class="n">timeOutInSeconds</span><span class="o">,</span> <span class="n">sleepInMillis</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">protected</span> <span class="n">AppiumDriverWait</span><span class="o">(</span><span class="n">AppiumDriver</span> <span class="n">driver</span><span class="o">,</span> <span class="n">Clock</span> <span class="n">clock</span><span class="o">,</span> <span class="n">Sleeper</span> <span class="n">sleeper</span><span class="o">,</span> <span class="kt">long</span> <span class="n">timeOutInSeconds</span><span class="o">,</span>
<span class="kt">long</span> <span class="n">sleepTimeOut</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">(</span><span class="n">driver</span><span class="o">,</span> <span class="n">clock</span><span class="o">,</span> <span class="n">sleeper</span><span class="o">);</span>
<span class="n">withTimeout</span><span class="o">(</span><span class="n">timeOutInSeconds</span><span class="o">,</span> <span class="n">TimeUnit</span><span class="o">.</span><span class="na">SECONDS</span><span class="o">);</span>
<span class="n">pollingEvery</span><span class="o">(</span><span class="n">sleepTimeOut</span><span class="o">,</span> <span class="n">TimeUnit</span><span class="o">.</span><span class="na">MILLISECONDS</span><span class="o">);</span>
<span class="n">ignoring</span><span class="o">(</span><span class="n">NotFoundException</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">merlini</span><span class="o">.</span><span class="na">app</span><span class="o">.</span><span class="na">common</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">io.appium.java_client.AppiumDriver</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.google.common.base.Function</span><span class="o">;</span>
<span class="kd">public</span> <span class="kt">int</span><span class="n">erface</span> <span class="n">AppiumExpectedCondition</span><span class="o"><</span><span class="n">T</span><span class="o">></span> <span class="kd">extends</span> <span class="n">Function</span><span class="o"><</span><span class="n">AppiumDriver</span><span class="o">,</span><span class="n">T</span><span class="o">>{</span>
<span class="o">}</span>
这样就可以 AppiumDriverWait 代替WebDriverWait
如:
<span class="cm">/**
* 根据控件description抓取批量元素
* @param elementType
* @param desc
* @return
*/</span>
<span class="kd">public</span> <span class="n">List</span><span class="o"><</span><span class="n">WebElement</span><span class="o">></span> <span class="n">findElementsByDescription</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span> <span class="n">elementType</span><span class="o">,</span><span class="kd">final</span> <span class="n">String</span> <span class="n">desc</span><span class="o">){</span>
<span class="n">AppiumDriverWait</span> <span class="n">wait</span><span class="o">=</span><span class="k">new</span> <span class="n">AppiumDriverWait</span><span class="o">(</span><span class="n">driver</span><span class="o">);</span>
<span class="n">List</span><span class="o"><</span><span class="n">WebElement</span><span class="o">></span> <span class="n">ele</span><span class="o">=</span> <span class="n">wait</span><span class="o">.</span><span class="na">until</span><span class="o">(</span> <span class="k">new</span> <span class="n">AppiumExpectedCondition</span><span class="o"><</span><span class="n">List</span><span class="o"><</span><span class="n">WebElement</span><span class="o">>>(){</span>
<span class="kd">public</span> <span class="n">List</span><span class="o"><</span><span class="n">WebElement</span><span class="o">></span> <span class="n">apply</span><span class="o">(</span><span class="n">AppiumDriver</span> <span class="n">driver</span><span class="o">){</span>
<span class="k">return</span> <span class="n">driver</span><span class="o">.</span><span class="na">findElementsByAndroidUIAutomator</span><span class="o">(</span><span class="s">"new UiSelector().className(\"android.widget."</span><span class="o">+</span><span class="n">elementType</span><span class="o">+</span><span class="s">"\").description(\""</span><span class="o">+</span><span class="n">desc</span><span class="o">+</span><span class="s">"\")"</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">});</span>
<span class="k">return</span> <span class="n">ele</span><span class="o">;</span><span class="c1">//driver.findElementsByAndroidUIAutomator("new UiSelector().className(\"android.widget."+elementType+"\").description(\""+desc+"\")"); </span>
<span class="o">}</span>