1

我正在使用 Selenium WebDriver 和 Ruby 编写自动化测试。所以,我正在考虑将元素保存在另一个文件中,将实际代码保存在另一个文件中。对于 Ruby,我发现yamlgem 可以存储和访问数据。因此,我将元素存储在lib.yml并测试代码test.rb如下:

lib/lib.yml

homepage:
  frame: 'mainPage'
  email: 'loginPage-email'
  password: 'loginPage-password'
  login_button: 'btnLogin'

测试/test.rb

require 'selenium-webdriver'
require 'yaml'

driver = Selenium::WebDriver.for :firefox

driver.get 'http://www.abc.com'

config = YAML.load_file('./lib/lib.yml')

driver.switch_to.frame(config['homepage']['frame'])

email = driver.find_element(:id, config['homepage']['email'])
password = driver.find_element(:id, config['homepage']['password'])

email.clear
email.send_keys 'abc@gmail.com'

password.clear
password.send_keys 'password'

driver.find_element(:id, config['homepage']['login_button']).click

driver.quit

这样维护变得更容易。我只是想确定这样做是否是一个好方法。我问是因为我是第一次尝试这个,不知道如果我为更大的项目选择这个我会遇到什么困难。

我知道,使用 Page 对象模型,我们可以实现相同的目标。但我不知道 Page 对象。那么我应该避免使用ymlgem并直接使用page objectgem吗?

另外,有人可以解释一下如何使用yml不是个好主意(如果不是的话)?

笔记:

  1. 在上面的代码中,config['homepage']['something']是重复的代码。我将编写方法以避免重复。
4

3 回答 3

3

是的,这绝对是有用的...当将来有 UI 更改时,它将更改保持在最低限度..您总是只有一个地方可以编辑...您是否必须将任何数据传递给您的代码?如何存储传递给您的测试的自动化数据。唯一的问题可能是您最终可能会得到太多难以跟踪的 yaml 文件...

于 2013-09-29T06:40:59.397 回答
1

在您的具体情况下,我看不出这会增加多少价值。一半的设置(框架、登录按钮)不会因您的测试而改变,所以我建议将它们直接留在使用它们的代码中。html 结构通常不会改变。

当您想尝试不同的用户(即不同的情况)时,其他两个值(电子邮件、密码)似乎可能会改变。如果您有一个包含多个示例输入的测试,那么我建议使用更易读的解决方案作为 Cucumber。

(我还是建议使用 capybara 来测试浏览器交互,因为它抽象了底层驱动程序的许多细节)

除此之外,yaml通常是存储配置的 ruby​​ 方式。

于 2013-09-29T06:48:56.043 回答
0

我又添加了一个步骤:在 yaml 本身中声明定位器(id、name 等)。

Ex:(yaml) 
Declared env.rb which load the environment from yaml files
env.yml:
    LOGIN:
       UserName:  {id:  UserName}
       Password: {id: Password}
       RememberME: {id: RememberMe}
      Submit: {xpath: "//input[@value='Log On']"}

Then added "pages\Login.rb"

#Loads all objects from yaml 
    def get_objects 
     username=@browser.find_element( $object_array['LOGIN']['UserName'])
     password=@browser.find_element( $object_array['LOGIN']['Password'])
     remember_me=@browser.find_element( $object_array['LOGIN']['RememberME'])
     submit= @browser.find_element($object_array['LOGIN']['Submit'])
    end



#Added methods in this class like
    def loginas(uname,pass)
      username.send_keys uname
      password.send_keys pass
      remember_me.click
      submit.click      
    end #loginas_siteadmin

Created Tests file Login_tests.rb

    lp=LoginPage::new(@browser)
    lp.navigate
    lp.loginas('SiteAdmin','password123')

这样你的脚本和可维护的,最重要的是你没有任何其他外部 gem 或依赖项。

于 2014-01-13T13:57:28.893 回答