11.1.使用JavaScript操作页面元素
#构造JavaScript查找百度首页的搜索输入框的代码字符串: searchImputBoxJS = "document.getElementById('kw').value = '你的意义';"
#构造JavaScript查找百度首页的搜索按钮代码字符串:searchButtonJS = "document.getElementById('su').click()"
11.2.操作Web页面的滚动条
#使用javaScript的scrollTo函数和document.body.scrollHeight参数
#将页面的滚动条滑动到页面的最下方:self.driver.execute_script("window.scrollTo(100, document.body.scrollHeight);")
#使用JavaScript的scrollIntoView函数将被遮挡的元素滚动到可见屏幕上
#scrollIntView(true)表示将元素滚动屏幕中间
#scrollView(false)表示将元素滚动到屏幕底部
self.driver.execute_script("document.getElementById('choice').scrollIntoView(true);")
#使用JavaScript的scrollBy方法,使用0和400横纵坐标参数
#将页面纵向向下滚动400像素
self.driver.execute_script("window.scrollBy(0, 400);")
11.3.在Ajax方式产生的浮动框中,单击选择包含某个关键字的选项
#通过for循环和上下箭头移动选中:send_key(Keys.DOWN)
#通过定位模糊匹配:self.driver.find_element_by_xpath("//ul/li[contains(., '篮球电影')]").click
#固定选择浮动框第三选项:self.driver.find_element_xpath("//*[@id = 'vl']/div[1]/ul/li[3]").click
11.4.结束Windows中浏览器的进程
#需要导入os包(import os): ReturnCode = os.system("taskkill /F /iM firefox.exe")
if ReturnCode == 0:
print (u"成功结束firefox浏览器进程!")
else:
print (u"结束firefox浏览器进程失败!")
11.5.更改一个页面对象的属性值
#定义新增,更改,查询,删除函数
def addAttribute(driver, elementObj, attributeName, value):
driver.execute_script("arguments[0].%s = arguments[1]" % attributeName, elementObj, value)
def setAttribute(driver, elementObj, attributeName, value):
driver.execute_script("arguments[0].setAttribute (arguments[1], arguments[2])", elementObj, attributeName, value)
def getAttribute(elementObj, attributeName):
return elementObj.get_attribute(attributeName)
def removeAttribute(driver, elementObj, attributeName):
driver.execute_script("arguments[0].removeAttribute (arguments[1])", elementObj, attributeName)
#新增属性name = "search": addAttribute(self.driver, element, 'name', "search")
#更改value的属性值:setAttribute(self,driver, element, "value", u"这是更改后的文字内容")
#查看属性值: print u("更改文本框标签中的内容后的内容:", getAttribute(element, "value"))
#删除文本框value属性:removeAttribute(self.driver, element, "value")
11.6.无人工干预地自动下载某个文件
class downloadFile(unittest.TestCase):
def setUp(self):
# 创建一个FirefoxProfile实例来自定义配置
profile = webdriver.FirefoxProfile()
#指定下载路径,默认只会自动创建一级目录,如果指定了多级不存在的目录,将会下载到默认路径。
profile.set_preference('browser.download.dir', 'E:\\python\IDOWNLOAD')
#将browser.download.folderList设置为2,表示将文件下载到指定路径;设置为0表示下载到桌面,设置为1下载到默认路径。
profile.set_preference('browser.download.folderList', 2)
#browser.helperApps.alwaysAsk.force对于未知的MIME类型文件会弹出窗口让用户处理,默认值为True,设定为False表示不会记录打开未知MIME类型文件的方式
profile.set_preference('browser.helperApps.alwaysAsk.force', False)
#在开始时显示下载管理器
profile.set_preference('browser.download.manager.showWhenStarting', False)
#设定为False会把下载框进行隐藏
profile.set_preference('browser.download.manager.useWindow', False)
#默认值为True,设定为False表示不获取焦点
profile.set_preference('browser.download.manager.focusWhenStarting', False)
#下载.exe文件弹出警告,默认为True,设定为False则不会弹出警告框
profile.set_preference('browser.download.manager.alertOnEXEOpen', False)
#browser.helperApps.neverAsk.openFile表示直接打开下载文件,不显示确认框,默认值为空字符串,下行代码设定了多种文件的MIME类型
#例如application/exe,表示.exe类型的文件,application/execl表示Execl类型的文件
profile.set_preference('browser.helperApps.neverAsk.openFile', 'application/pdf')
#对所给出文件类型不再弹出提示框进行询问,直接保存本地磁盘
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'application/zip, application/octet - stream')
#browser.download.manager.showAlertOnComplete设定下载文件结束后是否显示下载完成提示框,默认为True,设定为False表示下载完成后不显示提示框
profile.set_preference('browser.download.manager.showAlertOnComplete', False)
#browser.download.manager.closeWhenDone设定下载结束后是否自动关闭下载框,默认为True,设定为False表示不关闭下载管理器
profile.set_preference('browser.download.manager.closeWhenDone', False)
#启动浏览器时通过firefox_profile参数将自动配置添加到FirefoxProfile对象中
self.driver = webdriver.Firefox(firefox_profile= profile)
11.7.无人工干预地自动上传附件
webdriver的send_keys方法:执行sendKeys的元素一定要符合input和 type="file"条件,否则就是你没找对上传文件的对象,会上传失败的。
#定位上传框:filebox = self.driver.find_element_by_name("UploadFile")
#在文件框里传入文件路径:filebox.send_keys("F:\Wnian.txt")
模拟键盘操作,实现文件上传:
#用于设置剪贴板内容(import win32clipboard as w)
def setText(aString):
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_UNICODETEXT, aString)
w.CloseClipboard()
#键盘按键映射字典
VK_CODE = {
'enter' : 0x0D,
'ctrl' : 0x11,
'v' : 0x56}
#键盘键按下
def keyDown(keyName):
win32api.keybd_event(VK_CODE[keyName], 0, 0, 0)
def keyUp(keyName):
win32api.keybd_event(VK_CODE[keyName], 0, win32con.KEYEVENTF_KEYUP, 0)
self.driver.find_element_by_xpath('//*[@id="uploadBtn"]').click
keyDown('ctrl')
keyDown('v')
keyUp('ctrl')
keyUp('v')
keyDown('enter')
keyUp('enter')
使用第三方工具AutoIt上传文件
访问https://www.autoitscript.com/site/autoit/downloads/网址下载
SciTE4AutoIt3.exe(AutoIt编辑器)
os.system("d:\book\test.exe")
11.8 右键另存为下载文件(使用AutoIt工具)
os.system("d:\book\loadfile.exe")
11.9 操作日期控件
try:
wait = WebDriverWait(self.driver, 10, 0.2) #创建一个显示等待对象
wait.until(EC.element_to_be_clickable((By.ID, 'datepicker'))) #判断日期输入框是否可见可单击(import expected_conditongs as EC)
except: ....
else:
dateInputBox = self.driver.find_element_by_id("datepicker")
dateInputBox.send_keys("11/24/2016") #(遇到日期选择控件不允许用户输入的情况,可以通过JavaScript语句改变页面元素属性值的方式将日期控件改成可编辑状态)
11.10 启动带有用户配置信息的Firefox浏览器窗口
生成用户自定义的Firefox浏览器配置文件:
1. 调出cmd命令行。 2. cd进入Firefox.exe文件所在目录,输入firefox.exe-ProfileManager -no-remote命令。 3. 按enter调出“Firefox - 选择用户配置文件”对话框,单击“创建配置文件”按钮,在弹出界面直接单击下一步。 4. 在弹出“创建配置文件向导”窗体输入新配置文件名称,单击“完成”按钮完成配置文件。 5.在“选择用户配置文件”对话框中,就可以看见新的配置文件,选中它单击“启动Firefox”按钮完成自定义配置文件生成。(在webdriver启动浏览器的时候写入配置文件路径即可)
11.11 UI对象库
使用配置文件存储被测试页面上的页面元素的定位方式和定位表达式,做到定位数据和程序分离。
新建一个工程包括三个文件:Sogou.py 、ObjectMap.py 、 UiObjectMap.ini
UiObjectMap.ini内容如下:
[sogou]
searchbox = id > query
searchbutton = id > stb
ObjectMap.py表示ObjectMap工具类文件,供测试程序调用;
SoGou.py中调用ObjectMap工具类实现测试逻辑;
11.12 操作富文本框
富文本框的常见技术用到了Frame标签,并且在Frame里面实现了一个完整的HTML结构,所以使用普通定位模式无法直接定位到富文本框对象。
1. 只调用send_keys()方法即可输入,但必须要定位到操作元素,且不支持HTML格式的内容输入。
iframe = self.driver.find.element_by_xpath('//iframe[contain(@id, "ueditor_0")]') #获取邮件正文编辑区域的iframe页面元素对象
self.drier.switch_to.frame(iframe) #通过switch_to.frame()方法切换进入富文本框
editbox = self.driver.find_element_by_xpath("/html/body") #获取富文本框编辑页面元素对象
editbox.send_keys(u"邮件内容")
self.driver.switch_to.default_content()
2. 可以支持HTML格式的文字内容输入,但由于各种网页富文本框的实现机制不同,有可能定位富文本框的文件编辑区的对象比较困难。
iframe = self.driver.find.element_by_xpath('//iframe[contain(@id, "ueditor_0")]') #获取邮件正文编辑区域的iframe页面元素对象
self.drier.switch_to.frame(iframe) #通过switch_to.frame()方法切换进入富文本框
self.driver.execute_script("document.getElementsByTagName('body')[0].innerHTML = '邮件内容;'") #通过JavaScript向正文编辑框输入内容
self.driver.switch_to.default_content()
3. 不管什么富文本框,只要找到它上面的紧邻元素,然后通过模拟TAB键均可进入富文本框中,但不能进行HTML格式的内容输入。
subject.send_keys(Keys.TAB) #subject为标题栏的定位元素,使用模拟tab键切换到富文本编辑区域,然后使用ctrl+v组合键,将剪贴板内容粘贴到富文本框中。
keyDown("ctrl")
keyDown("v")
keyUp("v")
keyUP("ctrl")