Selenium 主要提供的是操作页面上各种元素的方法,但它也提供了操作浏览器本身的方法,比如浏览器的大小以及浏览器后退、前进按钮等。
- 在不同的浏览器大小下访问测试站点,对测试页面截图并保存,然后观察或使用图像比对工具对被测页面的前端样式进行评测。比如可以将浏览器设置成移动端大小(480x800),然后访问移动站点,对其样式进行评估;WebDriver 提供了set_window_size() 方法来设置浏览器的大小。
#coding=utf-8from selenium import webdriverdriver = webdriver.Firefox()driver.get("http://192.168.30.180/Uet-Platform/")#参数数字为像素点print"****设置浏览器宽480、高800 显示"**driver.set_window_size(480, 800)**driver.quit()
- 在使用浏览器浏览网页的时候,浏览器提供了后退和前进按钮,可以方便的对浏览过的网页之间切换,那么WebDriver 也提供了对应的back()和forward()方法来模拟后退和前进按钮。下面通过例子来演示这两个方法的使用。
#coding=utf-8from selenium import webdriverdriver = webdriver.Firefox()#访问百度首页first_url= 'http://www.baidu.com'print"now access %s" %(first_url)driver.get(first_url)#****访问新闻页面**second_url='http://news.baidu.com'print"now access %s" %(second_url)driver.get(second_url)#****返回(后退)到百度首页print"back to %s "%(first_url)driver.back()#****前进到新闻页print"forward to %s"%(second_url)driver.forward()driver.quit()
now access http://www.baidu.com
now access http://news.baidu.com
back to http://www.baidu.com
forward to http://news.baidu.com
driver.refresh() #****刷新当前页面**
2、send_keys(*value) 在元素上模拟按键输入
#coding=utf-8from selenium import webdriverimport unittest, time, redriver = webdriver.Firefox()driver.implicitly_wait(30)base_url ="http://192.168.30.180/Uet-Platform/masterLogin.action"#30****测试环境**driver.get(base_url)driver.find_element_by_id("txtUserName").clear()driver.find_element_by_id("txtUserName").send_keys("13554797004")driver.find_element_by_id("txtPassword").clear()driver.find_element_by_id("txtPassword").send_keys("123123")driver.find_element_by_link_text(u"登录").click()driver.switch_to_frame("lj_left")driver.find_element_by_xpath("//div[@id='left']/table/tbody/tr[6]/td").click()driver.find_element_by_link_text(u"****用户单位管理").click()
clear()方法用于清除文本输入框中的内容,例如登录框内一般默认会有“账号”“密码”等提示信息用于引导用户输入正确的数据,如果直接向输入框中输入数据,可能会与输入框中的提示信息拼接,本来用户输入为“username”,结果与提示信息拼接为“帐号username”,从而造成输入信息的错误;这个时候
可以先使用clear()方法清除输入框内的提示信息再进行输入。
send_keys()方法模拟键盘输入向输入框里输入内容。如上面的例子中通过这个方法向用户名和密码框中输入用户名和密码。
click()方法可以用来单击一个按钮,前提是它是可以被点击元素,它与send_keys()方法是web 页面操作中最常用到的两个方法。其实click()方法不仅仅用于点击一个按钮,还可以单击任何可以点击文字/图片连接、复选框、单选框、甚至是下拉框等。
#coding=utf-8from selenium import webdriverdriver = webdriver.Firefox()driver.get("http://www.youdao.com")driver.find_element_by_id('query').send_keys('hello')#提交输入框的内容driver.find_element_by_id('query').submit()driver.quit()
- 有些时候submit()可以与click()方法互换来使用,submit()同样可以提交一个按钮。
- size 返回元素的尺寸。
- text 获取元素的文本。
- get_attribute(name) 获得属性值。
- is_displayed() 设置该元素是否用户可见。
#coding=utf-8from selenium import webdriverdriver = webdriver.Firefox()driver.get("http://www.baidu.com")#****获得输入框的尺寸size=driver.find_element_by_id('kw').sizeprintsize#****返回百度页面底部备案信息text=driver.find_element_by_id("cp").textprinttext#返回元素的属性值,可以是id、name、type 或元素拥有的其它任意属性attribute=driver.find_element_by_id("kw").get_attribute('type')print attribute#返回元素的结果是否可见,返回结果为True 或Falseresult=driver.find_element_by_id("kw").is_displayed()print resultdriver.quit()
©2014 Baidu 使用百度前必读京ICP 证030173 号
执行上面的程序并获得执行结果:size 用于获取百度输入框的宽、高。text 用于获得百度底部的备案信息。get_attribute()用于获百度输入的type 属性的值。is_displayed()用于返回一个元素是否可见,如果可见返回True,否则返回False。
- 在现在的web 产品中,随着前端技术的发展,页面越来越华丽,鼠标的操作也不单单只有单击,现在页面中随处可以看到需要右击、双击、鼠标悬停、甚至是鼠标拖动等操作的功能设计。在WebDriver 中这些关于鼠标操作的方法由ActionChains 类提供。
3.1 ActionChains 类提供的鼠标操作的常用方法
- perform() 执行所有ActionChains 中存储的行为
- click_and_hold(element)左键点击
- context_click(elem) 右击
- double_click(elem) 双击
- drag_and_drop(source,target) 拖动
- move_to_element(elem) 鼠标悬停
对于ActionChains 类下所提供的鼠标方法与前面学过的click()方法有所不同,那么简单context_click()右键点击一个元素。
from selenium import webdriver*#引入ActionChains 类*from selenium.webdriver.common.action_chains import ActionChainsdriver = webdriver.Firefox()driver.get("http://yunpan.360.cn")#****定位到要右击的元素**right_click =driver.find_element_by_id("xx")#****对定位到的元素执行鼠标右键操作ActionChains(driver).context_click(right_click).perform()
from selenium.webdriver import ActionChains
对于ActionChains 类下面的方法,在使用之前需要先将模块导入。
调用ActionChains()方法,在使用将浏览器驱动driver 作为参数传入。
context_click()方法用于模拟鼠标右键事件,在调用时需要传入右键的元素。
执行所有ActionChains 中存储的行为,可以理解成是对整个操作事件的提交动作。
from selenium import webdriver#引入ActionChains 类from selenium.webdriver.common.action_chains import ActionChainsdriver = webdriver.Firefox()driver.get("http://www.baidu.com")#定位到要悬停的元素above =driver.find_element_by_id("xx")#对定位到的元素执行悬停操作ActionChains(driver).move_to_element(above).perform()...
from selenium import webdriver#引入ActionChains 类from selenium.webdriver.common.action_chains import ActionChainsdriver = webdriver.Firefox()#定位到要悬停的元素double_click = driver.find_element_by_id("xx")#对定位到的元素执行双击操作ActionChains(driver).double_click(double_click).perform()
from selenium import webdriver#引入ActionChains 类from selenium.webdriver.common.action_chains import ActionChainsdriver = webdriver.Firefox()#定位元素的源位置element = driver.find_element_by_name("xxx")#定位元素要移动到的目标位置target = driver.find_element_by_name("xxx")#执行元素的拖放操作ActionChains(driver).drag_and_drop(element,target).perform()
- 有时候我们在测试时需要使用Tab 键将焦点转移到下一个元素,Keys()类提供键盘上几乎所有按键的方法,前面了解到send_keys()方法可以模拟键盘输入,除此之外它还可以模拟键盘上的一些组合键,例:Ctrl+A、Ctrl+C 等。
from selenium.webdriver.common.keys import Keys #在使用键盘按键方法前需要先导入keys 类包。
send_keys(Keys.BACK_SPACE) 删除键(BackSpace) send_keys(Keys.SPACE) 空格键(Space) send_keys(Keys.TAB) 制表键(Tab) send_keys(Keys.ESCAPE) 回退键(Esc) send_keys(Keys.ENTER) 回车键(Enter) send_keys(Keys.CONTROL,'a') 全选(Ctrl+A) send_keys(Keys.CONTROL,'c') 复制(Ctrl+C) send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X) send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V) send_keys(Keys.F1) 键盘F1 …… send_keys(Keys.F12) 键盘F12
#coding=utf-8from selenium import webdriver#引入Keys 模块from selenium.webdriver.common.keys import Keysdriver = webdriver.Firefox()driver.get("http://www.baidu.com")#输入框输入内容driver.find_element_by_id("kw").send_keys("seleniumm")#删除多输入的一个mdriver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)#输入空格键+“教程”driver.find_element_by_id("kw").send_keys(Keys.SPACE)driver.find_element_by_id("kw").send_keys(u"教程")#ctrl+a 全选输入框内容driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')#ctrl+x 剪切输入框内容driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')#ctrl+v 粘贴内容到输入框driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')#通过回车键盘来代替点击操作driver.find_element_by_id("su").send_keys(Keys.ENTER)driver.quit()
- 如今大多数的web 应用程序使用AJAX 技术。当浏览器在加载页面时,页面内的元素可能并不是同时被加载完成的, 这给元素的定位添加的困难。如果因为在加载某个元素时延迟而造成ElementNotVisibleException 的情况出现,那么就会降低的自动化脚本的稳定性。
WebDriver 提供了两种类型的等待:显式等待和隐式等待。
#coding=utf-8from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Firefox()driver.get("http://www.baidu.com")element = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,"kw")))element.send_keys('selenium')driver.quit()
它是由webdirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver - WebDriver 的驱动程序(Ie, Firefox,Chrome 等)
poll_frequency - 休眠时间的间隔(步长)时间,默认为0.5 秒
ignored_exceptions - 超时后的异常信息,默认情况下抛NoSuchElementException 异常。
WebDriverWait()一般由until()(或until_not())方法配合使用,下面是until()和until_not()方法的说明。
调用该方法提供的驱动程序作为一个参数,直到返回值为Ture。
until_not(method, message=’ ’)
调用该方法提供的驱动程序作为一个参数,直到返回值为False。
在本例中,我们在使用expected_conditions 类时对其时行了重命名,通过as 关键字对其重命名为EC,
并调用presence_of_element_located()判断元素是否存在。
expected_conditions 类提供一些预期条件的实现。
title_contains 用于判断标题是否包含xx 信息。
presence_of_element_located 元素是否存在。
visibility_of_element_located 元素是否可见。
presence_of_all_elements_located 判断一组元素的是否存在
text_to_be_present_in_element 判断元素是否有xx 文本信息
text_to_be_present_in_element_value 判断元素值是否有xx 文本信息
frame_to_be_available_and_switch_to_it 表单是否可用,并切换到该表单。
invisibility_of_element_located 判断元素是否隐藏
element_to_be_clickable 判断元素是否点击,它处于可见和启动状态
element_to_be_selected 被选中的元素。
element_located_to_be_selected 一个期望的元素位于被选中。
element_selection_state_to_be 一个期望检查如果给定的元素被选中。
element_located_selection_state_to_be 期望找到一个元素并检查是否选择状态
除了expected_conditions 所提供的预期方法,我们也可以使用前面学过的is_displayed()方法来判断元素是否可。
#coding=utf-8from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitdriver = webdriver.Firefox()driver.get("http://www.baidu.com")input_ = driver.find_element_by_id("kw")element = WebDriverWait(driver,5,0.5).until(lambda driver : input_.is_displayed())input_.send_keys('selenium')driver.quit()
- 隐式等待是通过一定的时长等待页面所元素加载完成。哪果超出了设置的时长元素还没有被加载测抛NoSuchElementException 异常。WebDriver 提供了implicitly_wait()方法来实现隐式等待,默认设置为0。它的用法相对来说要简单的多。
#coding=utf-8from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitdriver = webdriver.Firefox()driver.implicitly_wait(10)driver.get("http://www.baidu.com")input_ = driver.find_element_by_id("kw22")input_.send_keys('selenium')driver.quit()
- implicitly_wait()默认参数的单位为秒,本例中设置等待时长为10 秒,首先这10 秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不真对页面上的某一元素进行等待,当脚本执行到某个元素定位时,如果元素可定位那么继续执行,如果元素定位不到,那么它将以轮询的方式不断的判断元素
是否被定位到,假设在第6 秒钟定位到元素则继续执行。直接超出设置时长(10 秒)还没定位到元素则抛出异常。
在上面的例子中,显然百度输入框的定位id=kw22 是有误的,那么在超出10 秒后将抛出异常。
#coding=utf-8from selenium import webdriverfromtime import sleepdriver = webdriver.Firefox()driver.get("http://www.baidu.com")sleep(2)driver.find_element_by_id("kw").send_keys("webdriver")driver.find_element_by_id("su").click()sleep(3)driver.quit()
- 在web 应用中经常会遇到frame 嵌套页面的应用,页WebDriver 每次只能在一个页面上识别元素,对于frame 嵌套内的页面上的元素,直接定位是定位是定位不到的。这个时候就需要通过switch_to_frame()方法将当前定位的主体切换了frame 里。
#coding=utf-8from selenium import webdriverimporttimeimport osdriver = webdriver.Firefox()file_path = 'file:///' + os.path.abspath('frame.html')driver.get(file_path)#****切换到iframe(id = "if")driver.switch_to_frame("if")#****下面就可以正常的操作元素了driver.find_element_by_id("kw").send_keys("selenium")driver.find_element_by_id("su").click()time.sleep(3)driver.quit()
#id = "if"driver.switch_to_frame("if")#name = "nf"driver.switch_to_frame("nf")
#先通过xpth 定位到iframexf = driver.find_element_by_xpath('//*[@class="if"]')#再将定位对象传给switch_to_frame()方法driver.switch_to_frame(xf)driver.switch_to_default_content()
#coding=utf-8from selenium import webdriverdriver = webdriver.Firefox()driver.implicitly_wait(10)driver.get("http://www.baidu.com")#****获得百度搜索窗口句柄sreach_windows= driver.current_window_handledriver.find_element_by_link_text(u'****登录').click()driver.find_element_by_link_text(u"****立即注册").click()#****获得当前所有打开的窗口的句柄all_handles = driver.window_handles#****进入注册窗口for handle in all_handles:if handle != sreach_windows:driver.switch_to_window(handle)print'now register window!'driver.find_element_by_name("account").send_keys('username')driver.find_element_by_name('password').send_keys('password')#****进入搜索窗口**for handle in all_handles:if handle == sreach_windows:driver.switch_to_window(handle)print'now sreach window!'driver.find_element_by_id('TANGRAM__PSP_2__closeBtn').click()driver.find_element_by_id("kw").send_keys("selenium")driver.find_element_by_id("su").click()time.sleep(5)driver.quit()
整个脚本的处理过程:首先打开百度首页,通过current_window_handle 获得当前窗口的句柄,并给变量sreach_handle。接着打开登录弹窗,在登录窗口上点击“立即注册”从而打开新的注册窗口。通过window_handles 获得当前打开的所窗口的句柄,赋值给变量all_handles。
第一个循环遍历all_handles,如果handle 不等于sreach_handle,那么一定是注册窗口,因为脚本执行只打开的两个窗口。所以,通过switch_to_window()切换到注册页进行注册操作。第二个循环类似,不过这一次判断如果handle 等于sreach_handle,那么切换到百度搜索页,关闭之前打开的登录弹窗,然后时行搜索操作。
current_window_handle 获得当前窗口句柄
window_handles 返回的所有窗口的句柄到当前会话
用于切换到相应的窗口,与上一节的switch_to_frame() 是类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。
- 在WebDriver 中处理JavaScript 所生成的alert、confirm 以及prompt 是很简单的。具体做法是使用switch_to_alert()方法定位到alert/confirm/prompt。然后使用text/accept/dismiss/send_keys 按需进行操做。
- text 返回alert/confirm/prompt 中的文字信息。
- accept 点击确认按钮。
- dismiss 点击取消按钮,如果有的话。
- send_keys 输入值,这个alert\confirm 没有对话框就不能用了,不然会报错。
#coding=utf-8from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsdriver = webdriver.Firefox()driver.implicitly_wait(10)driver.get('http://www.baidu.com')#鼠标悬停相“设置”链接link = driver.find_element_by_link_text(u'设置')ActionChains(driver).move_to_element(link).perform()#打开搜索设置driver.find_element_by_class_name('setpref').cick()#保存设置driver.find_element_by_css_selector('#gxszButton > a.prefpanelgo').click()#接收弹窗driver.switch_to_alert().accept()driver.quit()
- 文件上传操作也比较常见功能之一,上传功能操作webdriver 并没有提供对应的方法,关键上传文件的思路。
- 对web 页面的上功能,点击“上传”按钮需要打开本地的Window 窗口,从窗口选择本地文件进行上传,那么WebDriver 对于Windows 的控件是无能为力的
- 对于web 页面的上传功能一般会有以下几种方式。
#coding=utf-8from selenium import webdriverimport osdriver = webdriver.Firefox()#打开上传功能页面file_path = 'file:///' + os.path.abspath('upfile.html')driver.get(file_path)#定位上传按钮,添加本地文件driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')driver.quit()
- AutoIt 目前最新是v3 版本,这是一个使用类似BASIC 脚本语言的免费软件,它设计用于WindowsGUI(图形用户界面)中进行自动化操作。它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。
官方网站:Home - AutoIt
从网站上下载AutoIt 并安装,安装完成在菜单中会看到图的目录:
- AutoIt Windows Info 用于帮助我们识Windows 控件信息。
- Compile Script to.exe 用于将AutoIt 生成exe 执行文件。
- Run Script 用于执行AutoIt 脚本。
- SciTE Script Editor 用于编写AutoIt 脚本。
- 下面以操作upload.html 上传弹出的窗口为例讲解AutoIt 实现上传过程。
1.首先打开AutoIt Windows Info 工具,鼠标点击Finder Tool,鼠标将变成一个小风扇形状的图标,按住鼠标左键拖动到需要识别的控件上。
AutoIt Windows Info 识别“文件名”输入框控件
AutoIt Windows Info 识别“打开”按钮控件
窗口的title 为“选择要加载的文件”,标题的Class 为“#32770”。
文件名输入框的class 为“Edit”,Instance 为“1” ,所以ClassnameNN 为“Edit1”。
打开按钮的class 为“Button”,Instance 为“1” ,所以ClassnameNN 为“Button1”。
2.根据AutoIt Windows Info 所识别到的控件信息打开SciTE Script Editor 编辑器,编写脚本。
;ControlFocus("title","text",controlID) Edit1=Edit instance 1
ControlFocus("**选择要加载的文件", "","Edit1")
; Wait 10 seconds for the Upload window to appear
WinWait("[CLASS:#32770]","",10)
; Set the File name text on the Edit field
ControlSetText("选择要加载的文件", "", "Edit1", "D:\upload_file.txt")
ControlClick("选择要加载的文件", "","Button1");
ControlFocus()方法用于识别Window 窗口。WinWait()设置10 秒钟用于等待窗口的显示,其用法与WebDriver 所提供的implicitly_wait()类似。ControlSetText()用于向“文件名”输入框内输入本地文件的路径。这里的Sleep()方法与Python 中time 模块提供的Sleep()方法用法一样,不过它是以毫秒为单位,Sleep(2000)表示固定休眠2000 毫秒。ControlClick()用于点击上传窗口中的“打开”按钮。
AutoIt 的脚本已经写好了,可以通过菜单栏“Tools”-->“Go” (或按键盘F5)来运行一个脚本吧!
3、脚本运行正常,将其保存为upfile.au3,这里保存的脚本可以通过Run Script 工具将其打开运行,
但我们的目的是希望这个脚本被Python 程序调用,那么就需要将其生成exe 程序。打开Compile Script to.exe
图 Compile Script to.exe 生成exe 程序
点击“Browse”选择upfile.au3 文件,点击“Convert”按钮将其生成为upfile.exe 程序。
4、下面就是通过自动化测试脚本调用upfile.exe 程序实现上传了。
from selenium import webdriver
#**打开上传功能页面file_path = 'file:///' + os.path.abspath('upfile.html')driver.get(file_path)#**点击打开上传窗口
driver.find_element_by_name("file").click()
#**调用upfile.exe 上传程序os.system("D:\upfile.exe")driver.quit()**
通过Python 的os 模块的system()方法可以调用exe 程序并执行。
- 有时候我们需要验证浏览器中是否存在某个cookie,因为基于真实的cookie 的测试是无法通过白盒和集成测试完成的。WebDriver 提供了操作Cookie 的相关方法可以读取、添加和删除cookie 信息。
2、get_cookie(name) 返回有特定name 值有cookie 信息
3、add_cookie(cookie_dict) 添加cookie,必须有name 和value 值
4、delete_cookie(name) 删除特定(部分)的cookie 信息
5、delete_all_cookies() 删除所有cookie 信息
#coding=utf-8from selenium import webdriverimport timedriver = webdriver.Chrome()driver.get("http://www.youdao.com")# 获得cookie 信息cookie= driver.get_cookies()#将获得cookie 的信息打印print cookiedriver.quit()
============= RESTART ===============
u'value': u'aGFzbG9nZ2VkPXRydWU=',
u'name': u'_PREF_ANONYUSER__MYTH'},
u'value': u'1777851312@218.17.158.115',
u'value': u'abcUX9zdw0minadIhtvcu',
#coding=utf-8from selenium import webdriver**import time**driver = webdriver.Firefox()**driver.get("http://www.youdao.com")#向cookie 的name 和value 添加会话信息。driver.add_cookie({'name':'key-aaaaaaa', 'value':'value-bbbbbb'})#遍历cookies 中的name 和value 信息打印,当然还有上面添加的信息for cookie in driver.get_cookies():print"%s -> %s" % (cookie['name'], cookie['value'])driver.quit()
======================= RESTART ======================
YOUDAO_MOBILE_ACCESS_TYPE -> 1
_PREF_ANONYUSER__MYTH -> aGFzbG9nZ2VkPXRydWU=
OUTFOX_SEARCH_USER_ID -> -1046383847@218.17.158.115
JSESSIONID -> abc7qSE_SBGsVgnVLBvcu
- 从打印结果可以看到最后一条cookie 信息是在脚本执行过程中通add_cookie()方法添加的。通过遍历得到的所cookie 信息从而找到key 为“name”和“value”的特定cookie 的value。
那么在什么情况下会用到cookie 的操作呢?例如开发人员开发一个功能,当用户登录后,会将用户的用户名写入浏览器cookie,指定的key 为“username”,那么我们就可以通过get_cookies() 找到useranme,打印vlaue,如果找不到username 或对应的value 为空,那么说明保存浏览器的cookie 是有问题的。
delete_cookie() 和delete_all_cookies() 的使用也很简单,前者通过name 值到一个特定的cookie 将其删除,后者直接删除浏览器中的所有cookies()信息。
- WebDiver 不能操作本地Windows 控件,但对于浏览器上的控件也不是都可以操作的。比哪浏览器上的滚动条,虽然WebDriver 提供操作浏览器的前进和后退按钮,但对于滚动条并没有提供相应用的方法。那么在这种情况下就可以借助JavaScript 方法来控制浏览器滚动条。WebDriver 提供了execute_script()方法来执行JavaScript 代码。
- 一般用到操作滚动条的会两个场景:
(1)注册时的法律条文的阅读,判断用户是否阅读完成的标准是:滚动条是否拉到最下方。
(2)要操作的页面元素不在视觉范围,无法进行操作,需要拖动滚动条。
<body οnlοad= "document.body.scrollTop=0 ">** <body οnlοad= "document.body.scrollTop=100000 ">**
- 网页被卷去的高。scrollTop 设置或获取滚动条与最顶端之间的距离。如果想让滚动条处于顶部,那么可以设置scrollTop 的值为0,如果想让滚动条处于最底端,可以将这个值设置的足够大,大个窗口的高度即可。scrollTop 的值以像素为单位。
#coding=utf-8from selenium import webdriverimport time#访问百度driver=webdriver.Firefox()driver.get("http://www.baidu.com")#搜索driver.find_element_by_id("kw").send_keys("selenium")driver.find_element_by_id("su").click()time.sleep(3)#将页面滚动条拖到底部js="document.documentElement.scrollTop=10000"driver.execute_script(js)time.sleep(3)#将滚动条移动到页面的顶部js_="document.documentElement.scrollTop=0"driver.execute_script(js_)time.sleep(3)driver.quit()
- 通过浏览器打开百度进行搜索,搜索的一屏无法完全显示将会出现滚动条。这个时候就可以通过JavaScript 代码控制滚动条在任意位置,需要改变的就是scrollTop 的值。通过execute_script()方法来执行这段JavaScript 代码。
- 有时候滚动条不仅上下有,如上图,其它左右也有,那么可以通过下面JavaScript 代码来实现上下与左右滚动条的任意推动。
#window.scrollTo(左边距,上边距);window.scrollTo(0,450);js=" window.scrollTo(200,1000);"driver.execute_script(js)
- 或者参考这篇文章控制:通过selenium控制浏览器滚动条
用法与同上,通过execute_script()调用此代码,修改scrollTo()的参数即可。
当然,JavaScript 的作用不仅于此,它同样可操作页面上的元素或让,或让这个元素隐藏。
- 自动化脚本是交给工具去执行,有时候打印的错误信息并不十分明确,如果在脚本执行出错的时候将对当前窗口截图保存,那么通过图片信息会更只观帮助我们找到脚本出错的原因。Webdriver 提供了截图函数get_screenshot_as_file()来截取当前窗口。
#coding=utf-8from selenium import webdriverdriver = webdriver.Chrome()driver.get('http://www.baidu.com')try:driver.find_element_by_id('kw_error').send_key('selenium')driver.find_element_by_id('su').click()except :driver.get_screenshot_as_file("D:\\baidu_error.jpg")driver.quit()