0

我正在使用 cucumber、selenium-webdriver 和 page-object gem 进行测试自动化。当我尝试运行简单的测试黄瓜时,会遇到以下错误:

  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/fxdriver@googlecode.com/components/driver_component.js:8405:in `FirefoxDriver.prototype.findElementInternal_'
      [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/fxdriver@googlecode.com/components/driver_component.js:8414:in `FirefoxDriver.prototype.findElement'
      [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/fxdriver@googlecode.com/components/command_processor.js:10421:in `DelayedCommand.prototype.executeInternal_/h'
      [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/fxdriver@googlecode.com/components/command_processor.js:10426:in `DelayedCommand.prototype.executeInternal_'
      [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/fxdriver@googlecode.com/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

怎么了?司机不要等待元素的存在

4

3 回答 3

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 动态添加的,那么您将不得不编写一些代码来等到它存在,然后才能真正与它交互。要使用其他 gem,您唯一需要做的就是将Before块中的代码更改为:

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

我要给你的另一个指针是不要让一个页面对象返回下一页对象的实例。我在这里吃我自己的话,因为几年前我就是这样做的,但随着时间的推移我发现这是一种脆弱的方法。相反,我会使用PageObject::PageFactory来管理正确页面的创建,当您有一个通用步骤时,您可以简单地使用@current_page实例变量。

我要给你的最后一个指针是从你的页面对象中删除断言。我会让页面对象简单地提供抽象并在步骤定义中执行所有验证。这是一个更清晰的关注点分离,并且随着时间的推移会使您的测试更容易维护。

于 2013-04-13T14:12:08.853 回答
0

要么你可以使用 java 的 sleep 方法和 try catch。或隐式等待 selenium webdriver。Webdriver 从不等待元素显示......基本上你需要延迟。

于 2013-04-12T13:46:45.590 回答
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 好很多。也许这些可以解决您的元素计时问题。

于 2013-04-13T05:29:17.313 回答