原理
selenium是web应用的自动化框架,selenium提供很多程序语言的接口,包括java,python,js,ruby
1,安装selenium
1,本人选用谷歌浏览器(chrome),还可选择火狐,ie等,版本对应的浏览器驱动。得到chromedriver.exe文件
Chrome驱动下载地址
2,将浏览器驱动设置到环境变量
3,python 安装selenium包中,安装客户端库
#在dos命令行或linux终端
pip install selenium
4,在pycharm中调用selenium库进行使用
from selenium import webdriver
#创建webdriver对象,用于启动浏览器
wd=webdriver.Chrome(r'c:\chrome.driver.exe')#存储位置
#用get方法打开一个网址
wd.get('https://www.baidu.com')
2,webdriver API学习
2.1定位元素
注:css和xpath在用火狐浏览驱动时,可以有插件firepath和firebug,来自动生成css和xpath对应的语法
1,css定位
wd.find_element_by_css_selector('')
符号 | 例子 | 作用 |
---|---|---|
# | #name | id选择器,选择id="name"的元素 |
“.” | .name | class选择,选择class="name"的元素 |
+ | div+input | 同一级别中紧挨着div的input |
> | div>input | 表示父元素为div的input元素 |
空格 | div input | div的所有div后代元素 |
[attribute=value] | [target=zyc] | 属性定位,选择target为“zyc”的所有元素 |
example:
wd.find_element_by_css_selector(".sceme")
wd.find_element_by_css_selector("#name")
#组合定位
wd.find_element_by_css_selector("name.firstname>new>input.firs")
#要照标签为input对应属性值为firs,父元素为new,父父元素为name,其属性为firstname
|
2,xpath定位
xpath是一种在xml文件中定位元素的语言,又html是xml中的一种实现,故selenium。
1,绝对路径定位
wd.find_element_by_xpath("/html/body/d/input")
2,元素属性定位
#找到元素input且其id为‘kw’
wd.find_element_by_xpath("//input[@id='kw']")
wd.find_element_by_xpath("//input[@name='zyc']")
#如果不想指定标签名,用 * 号
wd.find_element_by_xpath("//*[@class="zho"]")
3,按次序选择
//p[2] p类型的第二个元素
//div/p[2] 父类元素为div的第二个p类型元素
//div/*[2] 父类元素为div的第二个元素
倒数
//p[last()] 倒数第一个
//p[last()-n] 倒数第n+1个
范围选择,css未有
//option[position() <= 2] 前两个option类的子元素
4,组选择,父节点,兄弟节点
#xpath选择父节点,css做不到
//*[@id='china']/.. id为china元素的父元素
兄弟节点
//*[@class='single_choice']/following-sibling::*
3,id定位
wd.find_element_by_id('')
4,name定位
wd.find_element_by_name('')
5,class定位
wd.find_element_by_class_name('')
6,tag标签定位
wd.find_element_by_tag_name('')
7,link定位
通过元素标签对之间的文本信息来定位元素
wd.find_element_by_link_text('新闻')
wd.find_element_by_link_text('地图')
8,partial link定位
是link定位的一部分,取文本链接的一部分
wd.find_element_by_partial_link_text('他是一个')
9,用by定位元素
针对webdriver另外一套方法,调用find_element()
from selenium.webdriver.common.by import By
wd.find_element(By.ID,'kw')
wd.find_element(By.NAME,'kw')
wd.find_element(By.CLASS,'kw')
wd.find_element(By.LINK_TEXT,'kw')
wd.find_element(By.PARTIAL_LINK_TEXT,'kw')
wd.find_element(By.XPATH,'//*[class='class']')
wd.find_element(By.CSS_SELECTOR,'span>input')
3,控制浏览器
driver=wd.Chrome()
driver.set_window_size(480,600)
driver.maximize_window() #最大化
driver.back() #后退
driver.forward() #前进
driver,refresh() #刷新页面
注意
frame 切换/窗口切换
frame切换
iframe元素非常特殊,在html语法中,frame元素或者iframe元素内部往往镶嵌有其他html文档,档我们打开一个网页的时候,内容是包含当前的frame中并不包含被嵌入的html文档里面的内容。
故,切换之。WebDriver的switch_to属性
wd.switch_to.frame('frame_reference')
其中frame_reference是其frame里面的属性name或id;
若是根据frame的元素位置或是属性特性,使用find系列方法,如下:`
wd.switch_to.frame(wd.find_element_by_tag_name('iframe'))
回到以前的frame中
wd.switch_to.default_content() 默认frame框
窗口切换
from selenium import webdriver
wd=webdriver.Chrome(r'c:\chrome.exe')
wd.implicitly_wait(10)
wd.get('http://www.baidu.com')
#保留之前窗口
formerWindow=wd.current_window_handle
for handle in wd.window_handles:
#先切换到对应窗口
wd.switch_to.window(handle)
#检测对应窗口是否目的窗口,此处为baidu,达到退出
if 'baidu' in wd.title:
break
#若是后面要切换回原来的同样的方法1
#法2:将以前的窗口在切换之前保留
#formerWindow=wd.current_window_handle
wd.switch_to.window(formerWindow)
wd.implicitly_wait(10)
此语句作用,当检测到find元素语句时,如果没找到语句就不报错,而是每隔半秒上去查看元素,生成webdriver,就立即开始查找。上限设置为10秒。