2013-04-12 52 views
0

我正在使用黃瓜,selenium-webdriver和頁面對象gem進行測試自動化。 當我試圖運行簡單的測試,黃瓜趕以下錯誤:PageObject「等待元素」方法不起作用

Scenario: Going to billing    # features/test.feature:10 
    When I click 'Платные услуги'   # features/step_definitions/test_steps.rb:13 
     Unable to locate element: {"method":"link text","selector":"Платные услуги"} (Selenium::WebDriver::Error::NoSuchElementError) 
     [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/[email protected]/components/driver_component.js:8405:in `FirefoxDriver.prototype.findElementInternal_' 
     [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/[email protected]/components/driver_component.js:8414:in `FirefoxDriver.prototype.findElement' 
     [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/[email protected]/components/command_processor.js:10421:in `DelayedCommand.prototype.executeInternal_/h' 
     [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/[email protected]/components/command_processor.js:10426:in `DelayedCommand.prototype.executeInternal_' 
     [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/[email protected]/components/command_processor.js:10366:in `DelayedCommand.prototype.execute/<' 
     ./features/pages/job_main_page.rb:38:in `go_to_billing' 
     ./features/step_definitions/test_steps.rb:14:in `/^I click 'Платные услуги'$/' 
     features/test.feature:11:in `When I click 'Платные услуги'' 

這裏是黃瓜的特點:

Scenario: Going to billing 
    When I click 'Платные услуги' 
    Then I should see "Коммерческие услуги" 

步驟定義,被測下降:

When(/^I go to billing$/) do 
    @job_myroom_billing = @job_myroom.billing_element.when_visible.go_to_billing 
end 

和頁面對象:

class BasePage 
    include PageObject 
    include RSpec::Matchers 
end 

class JobMyroom < BasePage 
    link :billing, link: 'Платные услуги' 

    def go_to_billing 
     billing 
     JobMyroomBilling.new @browser 
    end 
end 

class JobMyroomBilling < JobMyroom  
    #some code 
end 

怎麼了?驅動程序不要等待元素的存在

+0

無意中你打開一個新的瀏覽器,對不對? – e1che

+0

它永遠不會等待元素出現。我們使用的解決方案是:最後加載一個元素 - >在測試代碼運行之前添加一個額外的「等待元素」。有一些特殊的方法可以等待元素出現。 – User

+0

e1che,yes在hooks.rb中使用「before do」,「after do」方法:「@browser = Selenium :: WebDriver.for:firefox」和「@ browser.close」 –

回答

3

我覺得Sheg這裏提供了一些很好的意見,但我會傾向於做略有不同:

wait_until do 
    billing_element.visible? 
end 

你能做到這一點是非常相似的另一件事是本替換你的方法的代碼:

def go_to_billing 
    billing_element.when_present.click 
    JobMyroomBilling.new @browser 
end 

在這種情況下,我們都在等待,直到該鏈接存在,當它是when_present方法會返回元素,我們只需點擊它。

我可能會建議的另一件事是使用watir-webdriver作爲驅動程序而不是selenium-webdriver。 watir-webdriver建立在selenium-webdriver之上,但似乎有更好的處理等待項目實際加載到DOM上。如果您的鏈接是使用Ajax動態添加的,那麼您將不得不編寫一些代碼,直到它實際與之交互之前。你將不得不做用其他寶石的唯一的事情是在你的Before塊更改代碼這樣:

Before do 
    @browser = Watir::Browser.new :firefox 
end 

另一個指針我會給你是不是有一個頁面對象返回下一個實例頁面對象。我在這裏吃我自己的話,因爲幾年前這是我做的,但隨着時間的推移,我發現這是一種脆弱的做法。相反,我會使用PageObject::PageFactory來管理正確頁面的創建,並且當您有一個通用步驟時,您可以簡單地使用@current_page實例變量。

我會給你的最後一個指針是從頁面對象中移除斷言。我會讓頁面對象簡單地提供抽象,並在步驟定義中執行所有驗證。這是一個更清晰的關注點分離,並將使維護您的測試更容易。

+0

謝謝! 'when_present'和'click'方法可以幫助我。 PageObject :: PageFactory - 我只是利用這一點,我的步驟定義看起來更乾淨。 –

0

要麼你可以使用睡眠方法從java與try catch。或selenium webdriver的隱含等待。 Webdriver永遠不會等待元素顯示......基本上你需要延遲。

0

頁面對象when_visible方法意味着等待Ajax事件完成加載,如此處所述https://github.com/cheezy/page-object/wiki/Ajax-Calls

如果webdriver在完全呈現之前嘗試點擊鏈接元素,並且與Ajax無關,請考慮等待,直到首先使用webdriver顯示該元素。例如:

wait.until { driver.find_element(:link_text => "Платные услуги").displayed? } 
@job_myroom.go_to_billing 

你可以(強烈推薦)通過調用所有元素含蓄地做到這一點,下面你實例化你的webdriver之後:

driver.manage.timeouts.implicit_wait = 3 

此外,在許多情況下,我發現通過href查找鏈接比link_text執行得好很多。也許這些可以解決你的元素時間問題。