selenium python
介绍
启动
1 | #!/usr/bin/env python3 |
元素定位
定位元素先要掌握基本的HTML语法:
定位单个元素
1
2
3
4
5
6
7
8find_element_by_id('selenium') #通过id方式定位
find_element_by_name('selenium') #通过name方式定位
find_element_by_class_name('selenium') #通过class name 方式定位
find_element_by_tag_name('selenium') #通过tag name方式定位
find_element_by_link_text('selenium') #通过text方式定位
find_element_by_partial_link_text('selenium') #通过部分text方式定位
find_element_by_xpath('//input[@id="selenium"]') #通过xpath方式定位
find_element_by_css_selector('selenium') #通过CSS方式定位定位一组元素,批量对象(复选框)复选框
1
2
3
4
5
6
7
8find_element_by_id('selenium')
find_element_by_name('selenium')
find_element_by_class_name('selenium')
find_element_by_tag_name('selenium')
find_element_by_link_text('selenium')
find_element_by_partial_link_text('selenium')
find_element_by_xpath('//input[@id="selenium"]')
find_element_by_css_selector("[ value='百度一下']")相同属性的元素一组对象,取对应的第几个
1
2
3
4
5
6
7
8find_element_by_id('selenium')[1]
find_element_by_name('selenium')[1]
find_element_by_class_name('selenium')[1]
find_element_by_tag_name('selenium')[1]
find_element_by_link_text('selenium')[1]
find_element_by_partial_link_text('selenium')[1]
find_element_by_xpath('//input[@id="selenium"]')[1]
find_element_by_css_selector('selenium')[1]注意:()和(-1)都表示最后一个元素 xpath语法通过firepath插件可以生成,可以直接使用
高级
1
2
3
4
5
6
7
8
# 层级与属性结合
find_element_by_xpath("//div[@class='selenium']/input/span") find_element_by_xpath("//div[@class='selenium']/div[2]/input") find_element_by_xpath(.//*[@id='selenium']/../div/div/div[2]/div[4]/button)
# 通过逻辑运算符定位
find_element_by_xpath("//input[@id='selenium' and @class='selenium1']/span/input") find_element_by_css_selector("form#form>span>input#su")
1. 使用starts-with
//div[starts-with(@id,’res’)]//table//tr//td[2]//table//tr//td//a//span[contains(.,’Developer Tutorial’)]
2. 使用contains和and
//div[starts-with(@id,’res’)]//table[1]//tr//td[2]//a//span[contains(.,’_Test’) and contains(.,’KPI’)]
3. 使用descendant
//div[starts-with(@id,’res’)]//table[1]//tr//td[2]//a//span[contains(.,’QuickStart’)]/../../../descendant::img
4. 使用ancestor
//div[starts-with(@id,’res’)]//table[1]//tr//td[2]//a//span[contains(.,’QuickStart’)]/ancestor::div[starts-with(@id,’res’)]//table[2]//descendant::a[2]
5. 使用text()
//span[@id=’idHeaderTitleCell’ and contains(text(),’QuickStart’)]
控制
浏览器控制
1. 控制浏览器大小:1
2
3
driver.set_window_size(400,500)<br>
driver.maximize_window() #无参数
浏览器后退、前进:1
2
driver.back()-后退、 driver.farward()-前进
多表单切换(有frame嵌套表单)
1 |
|
多窗口切换
selenium-webdriver中使用switch_to_window()方法来切换任意窗口,常用方法有
driver.current_window_handle #获取当前窗口句柄
driver.window_handles #返回所有窗口句柄到当前会话
driver.switch_to_window() #进入窗口,用于切换不同窗口
dr.title
警告框处理
webdriver中处理js生成的alert、confirm、prompt处理方法是:使用switch_to_alert()定位到alert/confirm/prompt,
alert=dr.switch_to_alert() #进入alert
alert.text #打印对话框里的文字内容
alert.accept()#对话框里点击alert中确定按钮
alert.dismiss() #对话框里点击取消按钮
alert.send_keys(“对话框中输入的内容”) #在对话框里输入内容
十二、上传文件
分2种:普通上传、插件上传
普通上传:将本地文件的路径作为一个值放到input标签中,通过form表单提交时,将值传给服务器中去
插件上传:指基于flash、javascript或ajax技术实现的上传功能或插件。
1.针对普通上传用send_keys实现
python代码:
dr.get("D:\\workspace\\pySelenium\\resources\\upload.htm")
loadFile=dr.find_element_by_name("filebutton")# 获取上传文件input元素节点
loadFile.send_keys("D:\\workspace\\pySelenium\\resources\\frame.htm")#输入上传文件地址来实现上传
2.插件上传:使用AutoIt实现,--需要安装AutoIt程序
AutoIt安装,使用暂时略,需要时再追加,流程为:用AutoIt编写上传文件脚本生成exe文件,在python脚本中进行调用
python代码:
loadFile=dr.find_element_by_name("filebutton")# 获取上传按钮
loadFile.click() #点击上传按钮,弹出上传对话框
os.system("D:\\autoItFile.exe") #调用autoIt生成的exe文件,实现导入
十三、下载文件:使用AutoIt实现,–需要安装AutoIt程序,方法同上传
python代码:
ffp=webdriver.FirefoxProfile()
ffp.set_preference("browser.download.folderList",2)#0:代表下载到浏览器默认路径下;2:下载到指定目录
ffp.set_preference("browser.download.manager.showWhenStarting",False)#是否显示开始:True:显示;False:不显示
ffp.set_preference("browser.download.dir", os.getcwd())#指定下载文件目录,os.getcwd()无参数,返回当前目录
# ffp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream")#下载文件类型,
#指定下载页面的content-type值,application/octet-stream为文件类型,http-content-type常用对照表搜索百度
dr=webdriver.Firefox(firefox_profile=ffp)
dr.get("https://pypi.python.org/pypi/selenium#downloads")
dr.find_element_by_xpath("//div[@id='content']/div[3]/table/tbody/tr[3]/td[1]/span/a[1]").click()
#接下来使用autoIt实现
十四、cookies操作
webdriver操作cookies的方法:
get_cookies():获得所有cookies的值
get_cookie(name):获得有特定name值的cookie信息
add_cookie(cookie_dict):添加cookie,必须有name和value
delete_cookie(name):删除特定名称的cookie信息,通过name找到特定的cookie并删除
delete_all_cookies():删除浏览器中所有cookie的信息
注意:1.cookie是以字典形式进行存储的;
2.使用场景:如登录功能会把用户名写入浏览器cookie指定key为username,那么就可以通过get_cookies()找到username,打印value,找不到说明保存浏览器的cookie是有bug的。
python代码:
num=1
dr.get("http://www.baidu.com")
cookies=dr.get_cookies()#获取cookie的所有信息
for ck in cookies:
print'----所有cookie',num,':',ck #打印cookie的所有信息
num=num+1
print'----按name查cookie:',dr.get_cookie("PSTM")#通过cookie的name获取cookie信息
dr.add_cookie({'name':'hello','value':'123456789'})#向name和value添加会话信息
cookies2=dr.get_cookies()#重新获取cookie的所有信息
for ck2 in cookies2:
if ck2['name']=='hello':
print"----加入的cookie信息:%s-->%s",(ck2['name'],ck2['value'])
十五、javascript调用,python使用的方法:execute_script()
python代码:
dr.get("http://www.baidu.com")
dr.find_element_by_id("kw").send_keys("selenium")
dr.find_element_by_id("su").click()
js="var q=document.documentElement.scrollTop=1000" #滚动条滚到最下面
dr.execute_script(js)
time.sleep(4)
js2="var q=document.documentElement.scrollTop=0" #滚动条滚到页面顶
dr.execute_script(js2)
十六、截图,适用于脚本出错时,对当前窗口进行截图保存,使用函数:get_screenshot_as_file()
python代码:
dr.get("http://www.baidu.com")
try:
dr.find_element_by_id("kw1").send_keys("selenium")
dr.find_element_by_id("su").click()
exceptNoSuchElementException,msg:
dr.get_screenshot_as_file("d:\\error.jpg") #截图输出到d盘
print msg
dr.close()
十七、关闭窗口
quit():退出相关驱动程序并关闭所有窗口。
close():关闭当前窗口,打给多个窗口时,可使用来关闭当前窗口
事件
鼠标事件
1 |
|
键盘事件
1 |
from selenium.webdriver.common.keys importKeys
…
dr.get(“http://www.baidu.com")
#输入内容
dr.find_element_by_id(“kw”).send_keys(“seleniumm”)
#删除输入内容的最后一个字母,
dr.find_element_by_id(“kw”).send_keys(Keys.BACK_SPACE)
#输入:空格+教程
dr.find_element_by_id(“kw”).send_keys(Keys.SPACE)
dr.find_element_by_id(“kw”).send_keys(u”教程”)
#ctrl+a全选输入框内容
dr.find_element_by_id(“kw”).send_keys(Keys.CONTROL,’a’)
#ctrl+x剪贴输入框内容
dr.find_element_by_id(“kw”).send_keys(Keys.CONTROL,’x’)
#ctrl+v剪贴输入框内容
dr.find_element_by_id(“kw”).send_keys(Keys.CONTROL,’v’)
#回车键操作
dr.find_element_by_id(“su”).send_keys(Keys.ENTER)
dr.close()
常用的键盘操作整理:
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+x
send_keys(Keys.F1) #F1,类似的有F1-F121
2
动作
等待
显示等待
1 |
|
visibility_of_element_located:元素是否存在
visibility_of:是否可见
presence_of_all_elements_located:判断一组元素是否存在
text_to_be_present_in_element:判断元素是否有xx文本信息
text_to_be_present_in_element_value:判断元素值是否有xx文本信息
frame_to_be_available_and_switch_to_it:表单是否可见,并切换到该表单
invisibility_of_element_located:判断元素是否隐藏
element_to_be_clickable:判断元素是否点击,它处于可见和启动状态
staleness_of:等到一个元素不再依附于DOM
element_to_be_selected:被选中的元素
element_located_to_be_selected:一个期望的元素位于被选中
element_selection_state_to_be:一个期望检查如果给定元素被选中
element_located_selection_state_to_be:期望找到一个元素并检查是否是选择状态
alert_is_present:预期一个警告信息
1 |
隐式等待:
通过一定的时长等待页面所有元素加载完成,哪个元素超出设置时长没被加载就抛出异常NoSuchElementException,隐式等待是针对所有元素的1
2
implicitly_wait(5) #默认单位为秒
示例:
dr.implicitly_wait(5)1
2
sleep休眠
python中强制的程序等待1
2
time.sleep(4) #默认单位秒,设置小于1秒的时间可以用小数点如sleep(0.6)1
2
问题
验证码处理
方法1:去掉验证码
方法2:设置万能验证码
方法3:使用cookie方法获取,cookie时间延长
截屏
1 |
driver.save_screenshot(‘E:\pythonScript\images\‘+time.strftime(“%Y-%m-%d %H:%M:%S”, time.localtime())+’baidu.png’)1
2
Element取值
1 |
|
常用函数
1.获取当前页面的Url函数
driver.current_url
2.获取元素坐标
driver.find_element_by_id(‘selenium’).location
3.表单的提交
driver.find_element_by_id(‘selenium’).submit()
4.获取CSS的属性值
driver.find_element_by_css_selector(“input.btn”).value_of_css_property(“input.btn”)
5.获取元素的属性值
driver.find_element_by_id(‘selenium’).get_attribute(“selenium”)
6.判断元素是否被选中
driver.find_element_by_id(“form1”).is_selected()
7.返回元素的大小
driver.find_element_by_id(“iptPassword”).size
//返回值:{‘width’: 250, ‘height’: 30}
8.判断元素是否显示
driver.find_element_by_id(“iptPassword”).is_displayed()
9.判断元素是否被使用
driver.find_element_by_id(“iptPassword”).is_enabled()
10.获取元素的文本值 driver.find_element_by_id(“iptUsername”).text
11.元素赋值
driver.find_element_by_id(“iptUsername”).send_keys(‘admin’)
12.返回元素的tagName
driver.find_element_by_id(“iptUsername”).tag_name
13.删除浏览器所有的cookies
driver.delete_all_cookies()
14.删除指定的cookie
deriver.delete_cookie(“my_cookie_name”)
15.关闭浏览器
driver.close()
16.关闭浏览器并且推出驱动程序
driver.quit()
17.返回上一页
driver.back()
18.设置等待超时
driver.implicitly_wait(30)
19.浏览器窗口最大化
driver.maximize_window()
20.查看浏览器的名字
drvier.name
selenium版本进行降级
降级方法如下:
1)查看当前的selenium版本打开终端,输入 pip show selenium python3 -m pip show selenium python2.7 -m pip show selenium 2)删除当前python下的selenium版本为了避免与之前安装的selenium版本冲突,先找到selenium3.0目录:python\Lib\site-packages目录把里面selenium开头的文件全部删除就可以了。python所有的第三方包都在这个目录下面。selenium相关的目录全部删除。 3)打开终端,输入 pip install selenium==2.53.6 (注意是两个==,中间不要留空格,这里推荐2.53.6的版本) python3 pip install selenium==2.53.6 python2.7 pip install selenium==2.53.6
IE报错
File “D:\goodgoodstudy\Python35\lib\site-packages\selenium\webdriver\remote\webdriver.py”, line 248, in get self.execute(Command.GET, {‘url’: url}) File “D:\goodgoodstudy\Python35\lib\site-packages\selenium\webdriver\remote\webdriver.py”, line 236, in execute self.error_handler.check_response(response) File “D:\goodgoodstudy\Python35\lib\site-packages\selenium\webdriver\remote\errorhandler.py”, line 192, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: Failed to navigate to https://www.baidu.com. This usually means that a call to the COM method IWebBrowser2::Navigate2() failed.
该错误是需要在DCOM组件服务器中给Internet Explorer授权。操作如下: (1)打开开始菜单的运行对话框,输入dcomcnfg命令,确定,这时会弹出组件服务窗口 (2)展开计算机-〉我的电脑-〉DCOM配置,找到Internet Explorer应用程序节点 (3)单击右键-〉属性,选中”安全”选项,在下面三个项目都选择”自定义”,并单击编辑按钮 (4)在启动权限对话框中查看用户权限,全部给到最大权限。 (5) 选择”身份标识”,再选择”交互式用户”即可
以上完美解决了能打开浏览器但是一直不能获取到地址的问题。 from selenium.webdriver.common.desired_capabilities import DesiredCapabilities DesiredCapabilities.INTERNETEXPLORER[‘ignoreProtectedModeSettings’] = True
System.setProperty(“webdriver.chrome.driver”, “files/chromedriver.exe”); ChromeOptions options = new ChromeOptions(); options.setBinary(“C:/Chrome/Application/chrome.exe”); ChromeDriver driver = new ChromeDriver(options);