我正在使用Selenium WebDriver和Ruby编写自动化测试。所以,我正在考虑将元素保存在另一个文件中,将实际代码保存在另一个文件中。对于Ruby,我发现yaml
gem允许存储数据并访问它。因此,我将元素存储在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对象。那么我应该避免使用yml
gem并直接转到page object
gem?
此外,有人可以解释如何使用yml
不是一个好主意(如果不是)?
注意:
config['homepage']['something']
是重复代码。我会写一些方法来避免重复。答案 0 :(得分:3)
是的,这肯定是有用的......当将来有UI更改时,它会将更改保持在最低限度。您总是只有一个地方可以编辑...是否有任何数据需要传递给您的代码?如何存储传递给您的测试的自动化数据..唯一的问题可能是您可能最终得到太多yaml文件,这些文件很难跟踪...
答案 1 :(得分:1)
在您的具体情况下,我不知道这会增加多少价值。一半的设置(frame,login_button)不会因测试而改变,所以我建议将它们直接放在使用它们的代码中。 html结构通常不会发生变化。
当您想要尝试不同的用户(即不同的情况)时,其他两个值(电子邮件,密码)似乎可能会发生变化。如果您有一个带有多个示例输入的测试,那么我建议使用更易读的解决方案作为Cucumber。
(我建议使用capybara来测试浏览器交互,因为它抽象了底层驱动程序的许多细节)
除此之外,yaml 通常是用于存储配置的ruby方式。
答案 2 :(得分: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或依赖。