当定位好页面元素后,在自动化测试中就需要对该元素进行操作。在selenium中已经定义了不少方法,常用的如:click、tag_name、attribute、text、send_keys、clear、enabled?、displayed?、submit、location等等。通过字面也能理解该方法的作用,查看selenium的源码也能通过注释知道作用:
# Get the text content of this element
#
# @return [String]
#
def text
bridge.getElementText @id
end
element.text 就可以得到该元素的值,同理element.click 就是点击该元素。这样直接使用selenium的方法就可以完成对元素的操作,从而完成测试步骤和元素检查的工作。但是在实际工作中不建议这样直接使用selenium方法。我们要将这些方法重新封装到我们的测试框架中,在之前的文章《元素组织》中我们讲到了ElementBase元素基类,该类中有一个exist?方法,该方法就是封装了selenium的displayed?方法来判断元素是否存在。同样的我们继续在基类中定义更多的元素操作方法。
class ElementBase
.......
def click()
if exist?
@@element.click
end
end
# 如果要检查页面是否显示某个信息,这个方法很实用
def get_text
if exist?
@@element.text
end
end
end
按照上面的方式将selenium的元素操作方法封装到我们自定义的ElementBase类中。一般我们还会对操作进行分类,比如大部分元素都适用的方法我们放到ElementBase类中,但对一些特别元素才适用的我们会派生出子类来定义,比如send_keys方法只有input元素才会用到,于是单独定义一个input类,该类又继承于ElementBase类。
class TextInput < ElementBase
def input(string_text)
@@element.send_keys string_text
end
end
这样在定义一个输入框元素的时候继承于TextInput,并在构造函数实例化TextInput类。在case中使用该输入框的时候实例化该输入框,就可以调用input方法来输入值。
module AdminLogin
class TxtUserName < TextInput
def initialize
TextInput.new("xpath","//@name=uname","TxtUserName")
end
end
end
AdminLogin::TxtUserName.new.input userName