之前一直没有系统的梳理WebDriver Api的相关知识,今天借此机会整理一下。
1、页面元素定位
1.1、8种常用定位方法
# id定位 driver.find_element_by_id() # name定位 driver.find_element_by_name() # className定位 driver.find_element_by_class_name() # tag定位 driver.find_element_by_tag_name() # link定位 driver.find_element_by_link_text() # partial link定位 driver.find_element_by_partial_link_text() # xpath定位 driver.find_element_by_xpath() # css定位 driver.find_element_by_css_selector() |
1.2、实例
以百度输入框为例如下图
# id定位 driver.find_element_by_id('kw') # name定位 driver.find_element_by_name('wd') # className定位 driver.find_element_by_class_name('s_ipt') # tag定位 driver.find_element_by_tag_name('input') |
注意:由于name、class 、tag等不具有唯一性,所以不能区分不同的元素,所以很少使用。
link 定位与前面介绍的几种定位方法有所不同,它专门用来定位本链接。百度输入框上面的几个文本链接的代码如下:
<a class="mnav" name="tj_trnews" href="http://news.baidu.com">新闻</a>
<a class="mnav" name="tj_trhao123" href="http://www.hao123.com">hao123</a>
<a class="mnav" name="tj_trmap" href="http://map.baidu.com">地图</a>
<a class="mnav" name="tj_trvideo" href="http://v.baidu.com">视频</a>
<a class="mnav" name="tj_trtieba" href="http://tieba.baidu.com">贴吧>
通过查看上面的代码,我们发现通过 name 属性定位是个不错的选择。不过我们这里为了要学习 link定位,通过 link 定位实现如下:
find_element_by_link_text("新闻")
find_element_by_link_text("hao123")
find_element_by_link_text("地图")
find_element_by_link_text("视频")
find_element_by_link_text("贴吧")
通过 partial link 定位如下:
find_element_by_partial_link_text("一个很长的")
find_element_by_partial_link_text("文本连接")
find_element_by_link_text()方法通过元素标签对之间的部分文本信息来定位元素。
xpath 、css定位
# xpath定位
driver.find_element_by_xpath('//*[@id="kw"]')
# css定位
driver.find_element_by_css_selector('#kw')
通过 class 属性定位:
find_element_by_css_selector(".s_ipt")
find_element_by_css_selector(".bg s_btn")
find_element_by_css_selector()方法用于 CSS 语言定位元素,点号(.)表示通过 class 属性来定位元素。
通过 id 属性定位:
find_element_by_css_selector("#kw")
find_element_by_css_selector("#su")
井号(#)表示通过 id 属性来定位元素
1.3、定位一组元素
WebDriver 还提供了与之对应的 8 种定位方法用于定位一组元素。
find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()
定位一组对象的方法与定位单个对象的方法类似,唯一的区别是在单词 element 后面多了一个 s 表示复数。
定位一组对象一般用于以下场景:
批量操作对象,比如将页面所有的复选框都被勾选。
先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个。
如下图通过 css 定位出一组元素,然后获取对应文本,判断是否是自己需要的,然后获取对应下标。
fac_list = self.driver.find_elements_by_css_selector(".w220.ellipsis")
for fac in fac_list:
if fac.text == u'洛阳顺势药业有限公司':
i = fac_list.index(fac)
i = i+1
break
googs_path = ".//*[@id='search_result_list']/li[%d]/div/table/tbody/tr[1]/td[9]/p/a" % i
time.sleep(5)
以上完成了页面元素简单定位,当然这里只是最简单的举例,复杂的定位可以根据需要进行组合,当然也可以借助浏览器插件等工具,进行元素定位,如chrome 的开发者模式,firefox 的 firebug、firepath等工具
2、浏览器操作
2.1、控制浏览器大小
# 设置浏览器大小
driver.set_window_size(800,800)
# 设置浏览器最大化
driver.maximize_window()
2.2、控制浏览器后退、前进、刷新
# FileName : setWindow.py # Author : Adil # DateTime : 2018/3/12 16:48 # SoftWare : PyCharm from selenium import webdriver import time driver = webdriver.Chrome() driver.implicitly_wait(1) first_url = "http://www.baidu.com/" driver.get(first_url) time.sleep(5) # 设置浏览器大小 driver.set_window_size(800,800) # 设置浏览器最大化 driver.maximize_window() # 访问第二个页面 second_url = 'http://news.baidu.com/' driver.get(second_url) # 返回(后退)到百度首页 print("back to %s"%first_url) # back to http://www.baidu.com/ driver.back() # 前进到新闻页 print("forward to %s"% second_url) # forward to http://news.baidu.com/ driver.forward() time.sleep(5) driver.refresh() time.sleep(15) driver.quit() |
2.3、浏览器滚动
关于浏览器滚动条的滚动,之前,chrome与其他浏览器是不兼容的,参考 http://www.cnblogs.com/Skyyj/p/7275938.html
今天尝试发现,chrome 与其他浏览器兼容了,改变了原有的写法。
上下滚动统一支持如下写法
# 滚动到底部
js = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(5)
# 然后滚动到上面
js = "var q=document.documentElement.scrollTop=0"
driver.execute_script(js)
左右滚动
# 设置浏览器窗口大小,长500,高400 driver.set_window_size(500,400) time.sleep(5) # 设置横向滚动 js = 'window.scrollTo(500,400)' driver.execute_script(js) time.sleep(5) |
3、元素操作
3.1、元素简单操作
click() 单击、clear()清空、send_keys()文本框输入、submit()提交表单,模拟回车操作
driver.find_element_by_id("idInput").clear()
driver.find_element_by_id("idInput").send_keys("username")
driver.find_element_by_id("pwdInput").clear()
driver.find_element_by_id("pwdInput").send_keys("password")
driver.find_element_by_id("loginBtn").click()
3.2、鼠标事件
ActionChains 类提供的鼠标操作的常用方法:
perform() 执行所有 ActionChains 中存储的行为
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 鼠标悬停
# FileName : mouseSet.py # Author : Adil # DateTime : 2018/3/12 18:32 # SoftWare : PyCharm from selenium import webdriver # import ActionChains from selenium.webdriver.common.action_chains import ActionChains import time driver = webdriver.Chrome() # driver.implicitly_wait(1) first_url = "http://www.baidu.com/" driver.get(first_url) # 悬浮 move_to_element() time.sleep(2) driver.maximize_window() time.sleep(2) element1 = driver.find_element_by_xpath(".//*[@id='u1']/a[8]") ActionChains(driver).move_to_element(element1).perform() time.sleep(5) # 右击 context_click() ActionChains(driver).context_click(element1).perform() time.sleep(5) # 双击 double_click() ActionChains(driver).double_click(element1).perform() time.sleep(5) # 拖动 drag_and_drop() #定位元素的源位置 element = driver.find_element_by_name("xxx") #定位元素要移动到的目标位置 target = driver.find_element_by_name("xxx") #执行元素的拖放操作 ActionChains(driver).drag_and_drop(element,target).perform() driver.quit() |
3.3、键盘事件
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 from selenium import webdriver #引入 Keys 模块 from selenium.webdriver.common.keys import Keys driver = webdriver.Firefox() driver.get("http://www.baidu.com") #输入框输入内容 driver.find_element_by_id("kw").send_keys("seleniumm") #删除多输入的一个 m driver.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() |
4、多frame切换
在 web 应用中经常会遇到 frame 嵌套页面的应用,页 WebDriver 每次只能在一个页面上识别元素,对于 frame 嵌套内的页面上的元素,直接定位是定位是定位不到的。这个时候就需要通过 switch_to_frame()方法将当前定位的主体切换了 frame 里。
参看 hao123首页
# 曾经支持的写法 # driver.switch_to_frame("iframeu2872032_0") # 最新写法 driver.switch_to.frame("iframeu2872032_0") # 切换到该frame下,然后点击操作,到另一页面。 driver.find_element_by_xpath('//*[@id="container"]/div[3]/div/a').click() # 切换到初始frame driver.switch_to.default_content() time.sleep(2) driver.find_element_by_xpath('//*[@id="menus"]/li[2]/a').click() |
对于多层frame ,可以使用frame的索引切换
driver.switch_to.frame(3)
如果 iframe没有可用的id 和name属性,还可以使用xpath
# 先通过xpath定位到iframe xf = driver.find_element_by_xpath('XXXX') # 再将定位对象传给switch_to.frame(xf) driver.switch_to.frame(xf) ... |
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。