2010-09-06 102 views
1

我想讓Selenium RC啓動並運行在我的網站上進行一些自動測試。我發現我經常想驗證我沒有破壞任何功能,手動測試開始變得令人厭煩。Selenium RC WaitForPageToLoad掛起

但是,我似乎無法讓Selenium RC與WaitForPageToLoad一起使用。

我試圖複製他們在硒文檔中給出的基本示例,但測試總是卡在:$ this-> waitForPageToLoad(「30000」);我可以看到它在窗口中顯示得很遠,並且頁面似乎已正確加載(我們在Google搜索結果頁面)。但測試失敗,超時。

require_once 'PHPUnit/Extensions/SeleniumTestCase.php'; 

/** 
* Description of Test 
* 
* @author brian 
*/ 
class Test extends PHPUnit_Extensions_SeleniumTestCase { 

    function setUp() { 
     $this->setBrowser("*safari"); 
     $this->setBrowserUrl("http://www.google.com/"); 
    } 

    function testMyTestCase() { 
     $this->open("/"); 
    $this->type("q", "selenium rc"); 
    $this->click("btnG"); 
    $this->waitForPageToLoad("30000"); 
    $this->assertTrue($this->isTextPresent("Results * for selenium rc")); 
    } 
} 

更有意思的是,如果在等待時刷新頁面,則所有內容都會按預期繼續。所以它看起來好像waitForPageToLoad沒有意識到頁面已經加載。

回答

5

Selenium RC文檔中的示例已過時。谷歌改變了他們的主頁在不久前的工作方式,它不再是一個簡單的HTML頁面。現在按下搜索按鈕是一種AJAX類型的操作,它發送搜索請求並獲取由頁面中的JavaScript代碼處理的JSON響應。所以頁面永遠不會被重新加載,並且WaitForPageToLoad()最終會超時。

+0

謝謝!我沒有意識到這是問題所在。我認爲他們的例子會是最新的。一切似乎都在工作。 – Brian 2010-09-08 00:30:25

+0

哇!謝謝,爲我節省了很多時間! – Soph 2011-10-27 21:44:38

1

剛纔我碰到這種情況還有另一個可能的原因。根據documentation,如果您在加載頁面和調用waitForPageToLoad之間調用任何硒命令,那麼waitForPageToLoad可能會掛起。 (如果我理解正確,它在技術上是測試腳本和硒服務器之間的競爭條件,所以它有時會發生,不一定總是這樣)。

在大多數情況下,頁面加載是由點擊事件引起的。當你有一個測試腳本,如:

$this->click("/some/path"); 
// <<- NO SELENIUM COMMANDS HERE 
$this->waitForPageToLoad("30000"); 

請確保沒有硒命令不小心插入標記區域。

雖然這在技術上與OP發佈的問題不同,但它具有相同的錯誤消息,而且如果不進行深入挖掘,則無法找到此信息。希望未來更容易找到其他人。

0

我多次觀察到同樣的問題。因此,當用戶沒有離開當前頁面時,我沒有使用這個命令。它有時會掛起,並在while循環中使用IsElementPresent,並在返回true後退出。

0

「WaitForPageToLoad()」的一個變形是等待一個元素出現。


    $SECONDS = 360;

for ($second = 0; ; $second++) { 
    if ($second >= $SECONDS) $this->fail("TIMEOUT"); 
    try { 
     if ($this->isElementPresent("edit-submit")) break; 
    } catch (Exception $e) {} 

    sleep(1); 
} 

該代碼將循環360秒,檢查所述值(編輯提交)存在每個第二。 ( 「睡眠(1)」)。它基本上會達到與WaitForPageToLoad相同的結果,但是您可以指定絕對目標。