2010-06-24 18 views
4

我正在用硒測試一個django應用程序,我的一個網頁使用jquery ui tabs element。其中一個選項卡包含一個列出一些用戶的簡單表格,並通過ajax加載。當使用該應用程序時,該選項卡工作得很好,但是使用硒自動執行測試時,該選項卡似乎不會加載它的內容! 我在python中自己寫測試。起初,我用的是點擊硒RC的方法,但是當我從之前的測試中學到的東西時,這對於錨定標籤來說是非常麻煩的,所以我使用了之前使用的解決方案:wait_for_condition方法,並顯式調用標籤點擊事件(甚至是加載事件!),然而該標籤是仍然不工作!

我在這裏絕望了,我的大部分測試都依賴於那個頁面,其中幾乎一半都在那張桌子上,但是,唉,好像selenium搞砸了javascript! (我在課堂上有其他測試,它們運行得很好,所以在服務器級別沒有什麼奇怪的事情,它似乎是由客戶端的硒引起的問題) 我的測試代碼與此類似:如何用硒測試jquery ajax選項卡?

class TestMyApp(TransactionTestCase): 
urls = 'myapp.test_urls' 

def setUp(self): 
    self.verificationErrors = [] 
    self.selenium = selenium("localhost", 4444, "*chrome", "http://localhost:8000/") 
    self.selenium.start() 
    #self.selenium.set_speed(2000) 
    self.selenium.window_maximize() 
def test_users_list(self): 
    """Test that an app's users are correctly listed""" 
    sel = self.selenium 
    users = [] 
    for u in range(settings.FREE_USER_LIMIT/2): 
     users.append(self.app.users.create(name="testUser_%s"%uuid4())) 

    sel.open("/")   
    sel.wait_for_page_to_load("30000") 
    sel.wait_for_condition('selenium.browserbot.getCurrentWindow().jQuery("#tabs").tabs("select",1);\ 
    selenium.browserbot.getCurrentWindow().jQuery("#tabs").tabs("load",1);', 
          3000) 
    for user in users: 
     try: self.failUnless(sel.is_text_present(user.name)) 
     except AssertionError, e: self.verificationErrors.append(str(e)) 
     try: self.failUnless(sel.is_text_present(str(user.added.date()))) 
     except AssertionError, e: self.verificationErrors.append(str(e)) 
def tearDown(self): 
    self.selenium.stop() 
    self.assertEqual([], self.verificationErrors) 

回答

5

這可能是一些事情。可能是Selenium在點擊錨時遇到了問題,但實際上我沒有聽說過這個問題,聽起來也不太可能。聽起來像click()方法返回OK,它不會給你「找不到元素」,對吧?當你點擊jquery選項卡時,javascript只是沒有做到預期的那樣。根據我的經驗,這通常會歸結爲相同的問題 - 因爲Selenium執行得非常快,當JavaScript渲染頁面的某些部分並持續影響DOM時,有時Selenium會與頁面的動態生成部分進行交互(例如點擊此按鈕它與之交互的作品取決於其他作品尚未完全加載。事實上,它可能距離完全加載只有微秒,但硒太快。您當然已經理解了這一點,您有正確的想法來尋找要加載的選項卡的wait_for條件。我的猜測可能只是不夠長。你必須找到一些評估,說整個UI標籤的東西被加載和渲染。選項卡API是否可以添加一些回調來設置「完成加載」變量,或者它是否暴露了一個變量?除非找出恰當的表達方式來找到UI標籤實際上準備好點擊的時間點,這可能會非常棘手,您可以採用徹底的暫停來確保頁面部分已準備就緒你與它互動。如果需要使用它,我覺得在代碼中沒有問題(2),甚至沒有睡眠(5)等。你可以測試這種情況的一種方式是通過在交互式解釋器中啓動場景(需要愛Python,不要在Java中這樣做)。將代碼一行一行粘貼到故障點,或者在拆卸方法中註釋掉selenium.stop()調用和故障點後的任何測試代碼,因此它會打開硒窗並退出。然後實例在交互式interpretter硒對象,並劫持了公開會議:

selenium = selenium("localhost", 4444, "*chrome", "http://localhost:8000/") 
selenium.sessionId = "0asdd234234023424foo" #Get this from the Se window 

...獲取窗口的交互控制。然後,您可以看到有關如何調用selenium.click()或撥打selenium.get_eval('...js...')來調查當時的javascript情況。我的猜測是,當你這樣做的時候,click()實際上工作的很好,因爲當你加載會話並開始在selenium.click('blah_tab_locator')中輸入時,標籤的內容將全部加載並準備就緒。只是在Python進行調用時,對於瀏覽器來說,當這些動態渲染正在進行時,它的速度太快了。如果點擊工作正常,當你像這樣通過硒手動完成時,那麼你知道這是一個計時問題。找到適當的wait_for_condition或屈服於python sleep()。否則,如果在執行此操作時點擊仍不能正常工作,則可能是使用的定位器存在問題。選項卡UI在選項卡結構的某個部分有一個點擊或鼠標或焦點或某種事件處理程序,也許只是要找到選項卡的正確部分來點擊或激發正確的事件。如果不是那麼那麼它可能會是因爲你提到Selenium和Jquery UI之間的某種奇怪的交互,但是這會讓我感到驚訝,我很想知道。如果是的話,用get_eval()來查看javascript中發生了什麼。這聽起來像是一個時間問題,但我。

+0

ipython是偉大的,順便說一句。 http://ipython.scipy.org/moin/ – Purrell 2010-06-25 11:09:50

+1

不錯,我幾天前安裝了ipython,這真的很酷!所以,我做了你所說的話,耐心地一步一步地發現它實際上是我的錯:對於測試,我使用了一個自定義的URLConf(在django中爲url定位),並且ajax調用正在提高 - 一個404,所以這個元素從來沒有真的出現過!你的答案非常好,肯定會幫助我解決類似的問題,謝謝! – lfborjas 2010-06-25 23:06:11

+0

:)是的沒有問題,我很高興它有幫助。我一直處於相同的情況幾十(幾百?)次,所以我知道它是什麼樣子。這種事情可能會頻繁出現,所以我真的試圖通過特別小心來儘量減少故障排除時間,但ipython交互式調試技巧可以創造奇蹟,並在不可避免的怪癖出現時節省時間。我曾見過嘗試在Java中使用Se測試套件的工程商店......呃,爲Python解釋器感到高興! 乾杯! – Purrell 2010-06-26 00:00:02