WebDriver高级应用python+selenium

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 = '<b>邮件内容<b>;'")     #通过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")


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容