> web的自動化測試中,我們經常會遇到這樣一種情況:當我們的程序執行時需要頁面某個元素,而此時這個元素還未加載完成,這時我們的程序就會報錯。怎么辦?等待。等待元素出現后再進行對這個元素的操作。
在selenium-webdriver中我們用兩種方式進行等待:明確的等待和隱性的等待。
[TOC]
#### 明確的等待
>明確的等待是指在代碼進行下一步操作之前等待某一個條件的發生。最不好的情況是使用sleep()去設置一段確認的時間去等待。但為什么說最不好呢?因為一個元素的加載時間有長有短,你在設置sleep的時間之前要自己把握長短,太短容易超時,太長浪費時間。selenium webdriver提供了一些方法幫助我們等待正好需要等待的時間,比如以下例子中我們設置的最長等待時間為15秒。
~~~
<?php
namespace Facebook\WebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
require_once('vendor/autoload.php');
header("Content-Type: text/html; charset=UTF-8");
// start Firefox with 5 second timeout
$host = 'http://localhost:4444/wd/hub'; // this is the default
$waitSeconds = 15; //需等待加載的時間,一般加載時間在0-15秒,如果超過15秒,報錯。
$capabilities = DesiredCapabilities::chrome();
$driver = RemoteWebDriver::create($host, $capabilities, 5000);
$driver->get('https://www.baidu.com/');
//由于下拉框是通過點擊“搜索設置”按鈕觸發JS動態生成的DOM,所以這里使用Wait for new element to appear方式,不然直接調用查找元素會報錯,說找不到元素
$driver->wait($waitSeconds)->until(
WebDriverExpectedCondition::visibilityOfElementLocated(
WebDriverBy::id('kw')
)
);
$driver->findElement(WebDriverBy::id('kw'))->sendKeys('wwe');
echo 'done!';
//關閉瀏覽器
//$driver->quit();
?>
~~~
#### 隱性等待
> 隱性等待是指當要查找元素,而這個元素沒有馬上出現時,告訴WebDriver查詢Dom一定時間。默認值是0,但是設置之后,這個時間將在WebDriver對象實例整個生命周期都起作用。上面的代碼就變成了這樣:
~~~
<?php
namespace Facebook\WebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
require_once('vendor/autoload.php');
header("Content-Type: text/html; charset=UTF-8");
// start Firefox with 5 second timeout
$host = 'http://localhost:4444/wd/hub'; // this is the default
$capabilities = DesiredCapabilities::chrome();
$driver = RemoteWebDriver::create($host, $capabilities, 5000);
$driver->manage()->timeouts()->implicitlyWait(15); //隱性設置15秒
$driver->get('https://www.baidu.com/');
$driver->findElement(WebDriverBy::id('kw'))->sendKeys('wwe');
echo 'done!';
//關閉瀏覽器
//$driver->quit();
?>
~~~
>兩者選其一,第二種看起來比較一勞永逸。
如果一個無素沒有出現都會默認等待你所設定的時間,直到超時或者元素出現