Selenium中针对元素进行的动作在代码中可以分为两类:
Selenium::WebDriver::ActionBuilder
类中的动作方法Selenium::WebDriver::Element
类中的动作方法
其中ActionBuilder
类中的动作方法比较丰富,基本涵盖了所有可以进行的操作。
而Element
类的动作比较少,基本上只有点击和输入等简单的操作。
鼠标操作
鼠标点击
鼠标单击
driver.find_element(:link_text, 'Link1').click
鼠标双击
el = driver.find_element(id: "some_id")
driver.action.double_click(el).perform
鼠标右键
el = driver.find_element(id: "some_id")
driver.action.context_click(el).perform
鼠标拖放
把元素el1
拖到元素el2
上面
el1 = driver.find_element(id: "some_id1")
el2 = driver.find_element(id: "some_id2")
driver.action.drag_and_drop(el1, el2).perform
还可以按照指定的与某个元素的相对位置来拖放
el = driver.find_element(id: "some_id1")
driver.action.drag_and_drop_by(el, 100, 100).perform
#drag_and_drop_by(source, right_by, down_by)
方法有三个参数,source
是操作的对象元素,right_by
和down_by
是移动的控制参数,顾名思义表示向右和向下的偏移。
移动光标
Selenium中提供了两个移动鼠标光标的方法:
- 以当前光标位置为基准移动
driver.action.move_by(100, 100).perform
move_by(right_by, down_by)
方法的两个参数也是分别控制移动的偏移量。
- 以某个元素为基准移动
el = driver.find_element(id: "some_id")
driver.action.move_to(el).perform #移动到元素el上
driver.action.move_to(el, 100, 100).perform #移动到元素el的右下方(100,100)的位置
键盘操作
键盘输入
键盘上进行的最常用的操作就是输入了。
Selenium中通过send_keys
方法来实现
el = driver.find_element(id: "some_id")
#在元素el中输入help
driver.action.send_keys(el, "help").perform
按住和释放按键
有时候需要模拟按住键盘上的各种修饰键的操作,例如按照ctrl键和shift键的动作。
#按住CTRL键
driver.action.key_down(:control).perform
#释放CTRL键
driver.action.key_up(:shift).perform
#在元素el上按住和释放SHIFT键
el = driver.find_element(id: "some_id")
driver.action.key_down(el, :shift).perform
driver.action.key_up(el, :shift).perform
Selenium中定义了键盘上所有按键,可以在Selenium::WebDriver::Keys
中查找对应的名称。
清空文本框
在页面操作中有时候需要清空一个输入框中已有的内容,这时候需要用到clear
方法。
el = driver.find_element(id: "some_id")
el.clear
需要注意的是,这个操作仅限于在INPUT和TEXTAREA元素上操作,同时也可能无法达到期望的结果,这个时候可以利用键盘的操作CRTL+A(全选)之后再DELETE。
el = driver.find_element(id: "some_id")
el.send_keys([:control, 'a'],:backspace)
窗口操作
处理弹窗
在页面操作中时常要处理弹窗,Selenium中也提供了处理的方法。
alert = driver.switch_to.alert
alert.accept()
切换窗口
在运行自动化测试的过程中,有可能会出现打开了多个窗口的情况,这个时候需要在不同的窗口间切换。
driver = Selenium::WebDriver.for :chrome
driver.get 'http://test.com/windows'
driver.find_element(:id, 'new_window').click
#获取当前所有window对象
windows_array = driver.window_handles
#切换到第一个window
driver.switch_to.window(windows_array.first)
上传文件
上传文件是一个比较独特的用户与浏览器进行交互的场景,和之前的鼠标键盘操作有很大的不同。
在Selenium中,主要是通过send_keys
方法向上传文件的入口元素输入文件路径来实现的。这个操作有一个限制就是这个元素的类型必须是input。
driver = Selenium::WebDriver.for :chrome
filename = 'test.txt'
file_path = File.join(Dir.pwd, filename)
driver.get 'http://test.com/upload'
driver.find_element(:tagname, 'input').send_keys file_path
下载文件
下载文件其实并不是由某种动作来实现的,因为界面上触发下载的一般是一个按钮,点击之后触发下载。需要脚本开发者配置的是浏览器对于下载行为的处理,一般是设置一个默认的下载路径,同时设置自动下载不弹窗让用户确认。
下面就以Chrome和firefox上的浏览器配置为例介绍:
Chrome
DOWNLOAD_PATH = "path to store files"
prefs = {:download => {:prompt_for_download => false,
:default_directory => DOWNLOAD_PATH
},
}
prefs['profile.default_content_settings.multiple-automatic-downloads'] = 1
driver = Selenium::WebDriver.for :chrome, :prefs => prefs
Firefox
profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.download.dir'] = DOWNLOAD_PATH
profile['browser.download.folderList'] = 2
profile['browser.helperApps.neverAsk.saveToDisk'] = 'images/jpeg, application/pdf, application/octet-stream'
profile['pdfjs.disabled'] = true
driver = Selenium::WebDriver.for :firefox, profile: profile
这样文件就会自动下载到指定的路径下。