Python Selenium 常用方法

欢迎加入学习交流QQ群:657341423


在python中,自动化操作web,有selenium和splinter,后者主要根据前者进行一个封装,功能没有前者强大,但比较容易掌握上手,如果对于没有基础新手而言,可以学习后者再学前者。先说说Selenium的一些具体用法吧:
一、打开浏览器
driver的部署,调用浏览器需要用到浏览器的driver。
driver放置位置具有争议。有的说是在chrome 下运行脚本,需要将chromedriver.exe 放在chrome浏览器安装目录下
在ie 下运行脚本,需要将IEDriverServer.exe 放在ie浏览器安装目录下
还有火狐的geckodriver.exe
而我的driver放置是直接放置在python的安装目录下的,也是可以直接运行。
1,谷歌

from selenium import webdriver

driver=webdriver.Chrome()  #调用chrome浏览器

driver.get('https://www.baidu.com')

print driver.title

driver.quit()

2、火狐

from selenium import webdriver

browser = webdriver.Firefox()
browser.get('http://seleniumhq.org/')

3、IE

driver=webdriver.Ie()   #调用ie浏览器

二、浏览器常用功能

driver.maximize_window()#浏览器最大化
driver.set_window_size(480, 800)#设置浏览器宽480、高800显示
driver.back()#浏览器后退
driver.forward()#浏览器前进
driver.quit()#关闭浏览器
driver.title#获取浏览器标题
driver.current_url  #获取当前浏览器窗口网址

三、对象定位

find_element_by_id()
find_element_by_name()
#id和name定位有局限性,如果没有这些属性的就无法用这个定位

find_element_by_class_name()
find_element_by_tag_name()
#class_name和tag_name,在网页中会出现多次的情况。

find_element_by_link_text()
find_element_by_partial_link_text()
#文字链接,partial_link用于模糊匹配。

find_element_by_xpath()
find_element_by_css_selector()
这两种最常用,而且精准。

find_elements_by_XX和find_element_by_XX有明显区别,前者是复数。find_elements是不能直接点击的,它是复数的

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()

四、操作元素
操作元素的方法有下面几个:
 clear 清除元素的内容,如果可以的话
 send_keys 在元素上模拟按键输入
 click 单击元素
 submit 提交表单

driver.find_element_by_id("user_pwd").clear()
#用于清除输入框的默认内容
driver.find_element_by_id("user_pwd").send_keys("password")
#用于在一个输入框里输入xx 内容
driver.find_element_by_id("dl_an_submit").click()
#用于单击一个按钮
driver.find_element_by_id("dl_an_submit").submit()
#提交表单
#可看到可以使用submit()方法来代替click()对输入的信息进行提交,在有些情
况下两个方法可以相互使用;submit()要求提交对象是一个表单,更强调对信息的提交。click()更强调
事件的独立性
text=driver.find_element_by_id("cp").text
获取元素的text

location = driver.find_element_by_xpath("//div[@id='u1']/a[3]").location  
print (location)  
#坐标: {'y': 19, 'x': 498}  

attribute=driver.find_element_by_id("kw").get_attribute('type')
#返回元素的属性值,可以是id、name、type 或元素拥有的其它任意属性

result=driver.find_element_by_id("kw").is_displayed()
#返回元素的结果是否可见,返回结果为True 或False
result=driver.find_element_by_id("kw").is_selected
#返回元素的结果是否已选,用于checkbox和radio,返回结果为True 或False

更多方法可以参考:
Python\Lib\site-packages\selenium\webdriver\remote\webdriver.py

五、ActionChains 类鼠标操作的常用方法:
 context_click() 右击
 double_click() 双击
 drag_and_drop() 拖动
 move_to_element() 鼠标悬停在一个元素上
 click_and_hold() 按下鼠标左键在一个元素上
注意click()与上述鼠标操作方法是不同的,两者不属于同一个类。

#引入ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains

#定位到要右击的元素
right =driver.find_element_by_xpath("xx")

#对定位到的元素执行鼠标右键操作
ActionChains(driver).context_click(right).perform()

#driver:浏览器驱动 driver 作为参数传入
#context_click:鼠标操作方法
#right:需要操作元素

六、键盘事件

#引入Keys 类包
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
#输入框输入内容
driver.find_element_by_id("kw").send_keys("selenium")
time.sleep(3)
#删除多输入的一个m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
time.sleep(3)
#输入空格键+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys(u"教程")
time.sleep(3)
#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
time.sleep(3)
#输入框重新输入内容,搜索
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
time.sleep(3)
#通过回车键盘来代替点击操作
driver.find_element_by_id("su").send_keys(Keys.ENTER)
time.sleep(3)
driver.quit()

经常使用到的键盘操作:
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)
更多方法可以参看:
Python\Lib\site-packages\selenium\webdriver\common\keys.py文件

七、设置等待时间
implicitly_wait():是webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。
如果超出了设置时间的则抛出异常。
WebDriverWait():同样也是webdirver 提供的方法。在设置时间内,默认每隔一段时间检测一次当前
页面元素是否存在,如果超过设置时间检测不到则抛出异常。

implicitly_wait() 隐形等待
implicitly_wait()方法比sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。

WebDriverWait() 显示等待
详细格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver - WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)
timeout - 最长超时时间,默认以秒为单位
poll_frequency - 休眠时间的间隔(步长)时间,默认为0.5 秒
ignored_exceptions - 超时后的异常信息,默认情况下抛NoSuchElementException 异常。

具体说明:http://blog.csdn.net/huilan_same/article/details/52544521

八、定位一组对象
通常ID,classname,tag定位会生成一组元素的,如果用这种方法,而且想定位某一个元素,只能用循环这组元素,然后通过get_attribute判断。

# 选择页面上所有的tag name 为input 的元素
inputs = driver.find_elements_by_tag_name('input')
#然后从中过滤出tpye 为checkbox 的元素,单击勾选
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()

二次定位:
driver.find_element_by_id(‘xx’).find_element_by_link_text(‘xx’).click()

九、定位frame 中的对象

driver.switch_to.frame(0)  # 1.用frame的index来定位,第一个是0
# driver.switch_to.frame("frame1")  # 2.用id来定位
# driver.switch_to.frame("myframe")  # 3.用name来定位
#driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))  # 4.用WebElement对象来定位

从frame中切回主文档(switch_to.default_content())
driver.switch_to.default_content()

如果frame里面嵌套frame,一层层切进去
driver.switch_to.frame(“frame1”)
driver.switch_to.frame(“frame2”)

从frame2再切回frame1,这里selenium给我们提供了一个方法能够从子frame切回到父frame,而不用我们切回主文档再切进来。
driver.switch_to.parent_frame() # 如果当前已是主文档,则无效果

十、浏览器多窗口

#获得当前窗口
nowhandle=driver.current_window_handle
#获取全部窗口
allhandles=driver.window_handles
#获取第二个窗口
driver.window_handles[1]
#切换第二个窗口
driver.switch_to_window(driver.window_handles[1])
#关闭窗口
driver.close()


也可以通过循环全部窗口allhandles,然后通过判断title去切换窗口

十一、alert/confirm/prompt 处理
处理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 没有对话框就不能用了,不然会报错。

#获取网页上的警告信息
alert=driver.switch_to_alert()
#接收警告信息
alert.accept()
dirver.quit()
#接受警告信息
alert = driver.switch_to_alert()
alert.accept()
#得到文本信息并打印
alert = driver.switch_to_alert()
print alert.text()
#取消对话框(如果有的话)
alert = driver.switch_to_alert()
alert.dismiss()
#输入值(如果有的话)
alert = driver.switch_to_alert()
alert.send_keys(“xxx”)

十二、下拉框处理

#先定位到下拉框
m=driver.find_element_by_id("ShippingMethod")
#再点击下拉框下的选项
m.find_element_by_xpath("//option[@value='10.69']").click()

也有些下拉框是鼠标移上去直接弹出的,那么我们可以使用move_to_element()进行操作。

radio和checkbox直接通过find_element方式定位点击即可。

十三、上存文件
只要定位上传按钮,通send_keys 添加
本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在

<div class="row-fluid">
<div class="span6 well">
<h3>upload_file</h3>
<input type="file" name="file" />
</div>
</div>

driver.find_element_by_name(“file”).send_keys(‘D:\file.txt’)

下载文件

from selenium import webdriver
from time import sleep

options = webdriver.ChromeOptions()
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': 'd:\\'}
options.add_experimental_option('prefs', prefs)

driver = webdriver.Chrome(executable_path='E:\\Python\\chromedriver.exe', chrome_options=options)
driver.get('https://pypi.python.org/pypi/dodo_commands/0.5.1')
driver.find_element_by_xpath('//a[@class="button green"]').click()
sleep(3)
driver.quit()

executable_path:为chromedriver.exe路径。
download.default_directory:文件保存路径。

十四、执行js 一般有两种场景:
 一种是在页面上直接执行JS
 另一种是在某个已经定位的元素上执行JS

execute_script(script, *args)
在当前窗口/框架同步执行javaScript
script:JavaScript 的执行。
*args:适用任何JavaScript 脚本。

页面滚动条

#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#将滚动条移动到页面的顶部
js_="var q=document.documentElement.scrollTop=0"
driver.execute_script(js_)
time.sleep(3)

十五、Cookie处理
webdriver 操作cookie 的方法有:
 get_cookies() 获得所有cookie 信息
 get_cookie(name) 返回特定name 有cookie 信息
 add_cookie(cookie_dict) 添加cookie,必须有name 和value 值
 delete_cookie(name) 删除特定(部分)的cookie 信息
 delete_all_cookies() 删除所有cookie 信息

通过向浏览器中添加cookie 可以绕过登录的验证码,这是比较有意思的一种解决方案。我们可以在
用户登录之前,通过add_cookie()方法将用户名密码写入浏览器cookie ,再次访问系统登录链接将自
动登录。例如下面的方式:

....
#访问xxxx 网站
driver.get("http://www.xxxx.cn/")
#将用户名密码写入浏览器cookie
driver.add_cookie({'name':'Login_UserNumber', 'value':'username'})
driver.add_cookie({'name':'Login_Passwd', 'value':'password'})
#再次访问xxxx 网站,将会自动登录
driver.get("http://www.xxxx.cn/")
time.sleep(3)
....
driver.quit()

使用cookie 进行登录最大的难点是如何获得用户名密码的name ,如果找到不到name 的名字,就没
办法向value 中输用户名、密码信息。
笔者的建议是可以通过get_cookies()方法来获取登录的所有的cookie 信息,从而进行找到用户名、
密码的name 对象的名字
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值