测试自动化框架提供的是我使用Selenium Webdriver编写脚本的方法不是什么?

时间:2014-05-28 22:22:47

标签: xpath automation selenium-webdriver cucumber bdd

我是软件测试自动化的新手,并在Selenium Webdriver和Ruby绑定中编写了以下测试脚本。它执行用户操作(点击,输入,填写值等)。我已经将与屏幕文本值匹配的基本断言与我提供的值相对应。以下是代码:

puts "Test Run 1 has started ""["+Time.now.strftime('%H:%M:%S CST')+"]"
require "selenium-webdriver"
require "colorize"
profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.cache.disk.enable'] = false
browser = $browser = Selenium::WebDriver.for :firefox, :profile => profile

browser.manage().window().maximize();
browser.get "https://cameleon-6945--dev.cs11.cloudforce.com"
main_window = browser.window_handle
browser.find_element(name:"username").clear()
browser.find_element(name:"username").send_keys "abcd@vertex.com"
browser.find_element(name:"pw").send_keys "1234"
browser.find_element(name:"Login").click
browser.find_element(link_text:"Cameleon Quotes").click
wait = Selenium::WebDriver::Wait.new(:timeout => 45)
#Open Test Run 1 created quote
wait.until {browser.find_element(:css,"#bodyCell > div.bRelatedList > div.hotListElement > div > div.pbBody > table > tbody > tr.dataRow.even.first > th > a")}
browser.find_element(:css,"#bodyCell > div.bRelatedList > div.hotListElement > div > div.pbBody > table > tbody > tr.dataRow.even.first > th > a").click


wait.until {browser.find_element(:xpath,"/html/body/div[3]/div[3]/div[2]/div[3]/div[2]/div[2]/div[2]/form/div[3]/div/div[2]/div[2]/div/div/div/table")}
#browser.save_screenshot "Cart Overview - RegressionRun @ "+Time.now.strftime('%Y-%m-%d %H%M%S')+".jpeg"

#wait.until {browser.find_element(:css,"body > div.mainPartBox > div.boxBody > div.main > div.processBar > div.backgroundProcessBarMiddle > a:nth-child(7) > div.processBarElement.noSelected > div")}
#browser.find_element(:css,"body > div.mainPartBox > div.boxBody > div.main > div.processBar > div.backgroundProcessBarMiddle > a:nth-child(7) > div.processBarElement.noSelected > div").click

#wait.until {browser.find_element(:css,"body > div.CombinedBox > div.boxBody > div.main > div:nth-child(8) > iframe")}
#wait.until {browser.find_element(:xpath,"/html/body/div[3]/div[3]/div[2]/div[3]/iframe")}
browser.manage.timeouts.page_load = 35

#browser.switch_to.frame(cart_frame) 
puts "\n\n"
puts "Assertions to verify cart content values\n\n".yellow
element_value1 = browser.find_element(:css,"#total > tbody > tr > td:nth-child(4) > span").text
if element_value1 == "$314,507.30"
  puts 'Contract Sales Price = ' +element_value1
  puts 'Value as expected in the cart, Test Passed'
else
  puts 'Test failed, Contract Sales price value does not match the expected value'
end

puts "\n"
element_value2 = browser.find_element(:css,"#total > tbody > tr > td:nth-child(6) > span").text
if element_value2 == "$157,253.65"
    puts 'Contract Cost Price = ' +element_value2 
    puts 'Value as expected in the cart, Test Passed'
else
    puts 'Test failed, Contract Cost price value does not match the expected value'.red
end

puts "\n"
element_value3 = browser.find_element(:css,"#total > tbody > tr > td:nth-child(8) > span").text
if element_value3 == "50.00"
    puts 'Contract gross margin = ' +element_value3
    puts 'Value as expected in the cart, Test Passed'
else    
    puts 'Test failed, Gross margin value does not match the expected value'
end

puts "\n\n\t\t\t\t\tTest Case 1 passed successfully, proceeding to Test Case 2 - Generate Document\n".green

它没有与任何框架集成,它只是一个测试脚本。

我的问题是:

与Cucumber / Capybara等工具相比,这个测试完全没价值吗?

我已经使用XPath捕获了大多数元素,这是唯一的方法,因为它缺少类,ID等。现在,如果页面结构发生了微小变化,就像引入了新的div一样,这个脚本将失败并出现NoElemenFoundError。我们有什么方法可以避免它吗?或者这是编写测试脚本的唯一方法,我们需要定期更新它们并进行新的开发?

2 个答案:

答案 0 :(得分:2)

根据自己的经验,这项练习值得做一次。使用rspec作为示例的两种方法是改进,因为rspec为您提供了一种组织多个测试的方法,并且它将测试结果归结为成功或失败的单一指标,因此您可以只看在输出的最后一行(或让CI服务器查看退出状态)而不是读取消息页面以查看是否所有测试都通过了。黄瓜与rspec的不同之处在于它允许您在不读取任何代码的情况下用英语阅读整个测试,这对于思考需求非常有价值,并且可能允许您与非程序员协作进行测试。 Capybara提供的方法可以完成你在脚本中所做的很多工作但更简洁。

即使使用更复杂的工具,对页面结构的敏感性也是一个问题。最小化问题的一种方法是不再断言任何页面结构。如果页面上只有一个表格且只有一行结果,那么td:nth-child(6)就是您需要的所有选择器。处理该问题的另一种方法是在页面中添加ID或类以支持测试。

答案 1 :(得分:1)

我认为有这样的脚本是值得的,但是一旦你的脚本数量增加,你需要以最少维护的方式管理它们。

因此,您可以使用各种策略来设计一个框架,您可以在其中拥有中央对象存储库和测试数据。参考here!有关设计的更多细节。

我同意Dave,以避免在页面结构上断言。如果您维护一个中央存储库,那么如果页面结构发生变化,则几乎不需要进行任何修改。