参考链接:
web自动化测试教案:http://www.cnblogs.com/zidonghua/p/7430083.html
(IFRAME是HTML标签,作用是文档中的文档,或者浮动的框架(FRAME)
1.操作元素基本方法:
#coding:utf-8
from selenium import webdriver #将selenium导入到webdriver模块
driver=webdriver.Firefox() #定义驱动为Firefox浏览器
(1)打开就用get函数:
driver.get("https://www.baidu.com ") #打开百度浏览器
(2)设置等待时间就用sleep函数:
time.sleep(3) #等待3秒
(3) 页面刷新就用refresh函数:
driver.refresh() #刷新页面
(4) 页面切换:
driver.back() #返回上一页。
driver.forward() #切换到下一页
(5)设置窗口大小:
driver.set_window_size(540,960) #设置窗口大小为540*960分辨率
driver.maximize_window() #设置窗口最大化
(6)截屏后设置存放路径:
driver.get_screenshot_as_file(“D:\\test\\b1.jpg”) #截屏后将b1.jpg文件存放到D盘test文件夹中
(7)退出:
driver.close() #关闭当前窗口
driver.quit() #结束进程
2.操作元素(键盘和鼠标事件):
(1) 鼠标操作:
点击:click()
清空输入框:clear()
输入字符串:send_keys(),如果要发送中文,则字符串前要加u,
比如send_keys(u"你好哦")
提交表单:submit()
(2)鼠标悬停事件:
from selenium.webdriver.common.action_chainsimport ActionChains #导入包
perform() #用于执行所有ActionChains中的行为.
move_to_element() #鼠标悬停
(3)鼠标其他事件:
右击:context_click()
双击:double_click()
(2)键盘操作:在模拟键盘操作前先要导入键盘模块:
from selenium.webdriver.common.keys import Keys
send_keys(Keys.ENTER) # 模拟回车键
send_keys(Keys.CONTROL,'c') # 模拟ctrl+c
send_keys(Keys.CONTROL,'v') # 模拟ctrl+v
send_keys(Keys.CONTROL,'a') # 模拟ctrl+a
send_keys(Keys.CONTROL,'x') # 模拟ctrl+x
send_keys(Keys.TAB) # 模拟制表键TAB
3. handle(句柄)就相当于C中的函数指针,
元素有属性,浏览器的窗口其实也有属性的,只是你看不到,浏览器窗口的属性用句柄(handle)来识别。
获取当前页面的句柄:driver.current_window_handle
切换窗口:driver.switch_to.windows()
4.定位一组元素elements的步骤:
(1)用firebug查看页面元素,查看所输入关键字的搜索结果的共同属性:
<例>#coding:utf-8
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
driver.find_element_by_id("kw").send_keys(u"测试部落")
driver.find_element_by_id("kw").submit()
s=driver.find_element_by_css_selector("h3.t>a") #定位一组元素
(2)确认定位结果,可以通过attribute来获取href属性,并且打印出url地址:
for i in s:
print i.get_attribute("href")
5.随机函数:
(1)随机打印一个数,在此之前,需要先导入随机函数:import random.
<例>import random
t=random.randint(0,9)
print(t)
(2)随机打开url:
从返回结果中随机取一个url地址,通过get方法打开url。
<例>#coding:utf-8
from selenium import webdriver
import random
driver=webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
driver.find_element_by_id("kw").send_keys(u"测试部落")
driver.find_element_by_id("kw").submit()
s=driver.find_element_by_css_selector("h3.t>a") #定位一组元素
t=random.randint(0,9) #设置随机值
a=s[t].get_attribute("href") #随机取一个结果获取url地址
print a
driver.get(a)
6.iframe:
Frame与Iframe两者可以实现的功能基本相同,不过Iframe比Frame具有更多的灵活性。 frame是整个页面的框架,iframe是内嵌的网页元素,也可以说是内嵌的框 架,Iframe标记又叫浮动帧标记,可以用它将一个HTML文档嵌入在一个HTML中显示。
(1)如果要切换iframe,可以使用switch_to_frame方法实现;
<例>#coding:utf-8
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http:mail.163.com/")
driver.implicitly_wait(10)
driver.switch_to_frame("x-URS-iframe")
driver.find_element_by_name("email").send_keys("123")
driver.find_element_by_name("password").send_key("456")
(2)如果iframe没有id怎么办?
iframe的切换是默认支持id和name方法的,当然实际情况中会遇到没有id属性和name属性为空的情况,这时候就需要先定位iframe元素对象,这里我可以通过tag 先定位到,也能达到同样效果.
<例>#coding:utf-8
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http:mail.163.com/")
driver.implicitly_wait(10)
driver.switch_to_frame("x-URS-iframe")
driver.find_element_by_name("email").send_keys("123")
driver.find_element_by_name("password").send_key("456")
(3)释放iframe:如果想要返回到主页面可以用switch_to_default_content()方法回到主页面。
<例>#coding:utf-8
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http:mail.163.com/")
driver.implicitly_wait(10)
driver.switch_to_frame("x-URS-iframe")
driver.find_element_by_name("email").send_keys("123")
driver.find_element_by_name("password").send_key("456")
driver.switch_to.default_content() #释放iframe,重新回到主页面。
7.select下拉框的定位:
(1)二次定位方式:即先定位select框,再定位select里的选项;
<例> #coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Firefox()
url="https://www.baidu.com"
driver.get(url)
driver.implicitly_wait(10)
#鼠标移动到“设置”按钮
mouse=driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(mouse).perform()
driver.find_element_by_link_text("搜索设置").click()
#分两步:先定位下拉框,再点击选项
s=driver.find_element_by_id("nr")
s.find_element_by_xpath("//option[@value='50']").click()
(最后一步的另外写法:
driver.find_element_by_id("nr").find_element_by_xpath("//option[@value='50']").click()
)
(2)直接定位:就是要展开CSS样式表的层级结构,然后自己写xpath或者css,一次性直接定位到option上的内容即可。
8.select模块定位:
(1)导入Select模块,直接根据属性或索引定位index。
首先要导入select方法:from selenium.webdriver.support.select import Select
然后通过select选项的索引来定位选择对应选项(从0开始计数),如选择第三个选项:select_by_index(2)
<例> #coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import select
driver=webdriver.Firefox()
url="https://www.baidu.com"
driver.get(url)
driver.implicitly_wait(10)
#鼠标移动到“设置”按钮
mouse=driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(mouse).perform()
driver.find_element_by_link_text("搜索设置").click()
#通过索引:select_by_index()
s=driver.find_element_by_id("nr")
select(s).select_by_index(2) #通过index来定位,每页显示2条
(2)通过选项的value值来定位:
<例> #coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import select
driver=webdriver.Firefox()
url="https://www.baidu.com"
driver.get(url)
driver.implicitly_wait(10)
#鼠标移动到“设置”按钮
mouse=driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(mouse).perform()
driver.find_element_by_link_text("搜索设置").click()
#通过索引:select_by_value()
s=driver.find_element_by_id("nx")
select(s).select_by_value("20") #通过value来定位,每页显示20条
(3)通过选项的文本内容来定位:
<例> #coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import select
driver=webdriver.Firefox()
url="https://www.baidu.com"
driver.get(url)
driver.implicitly_wait(10)
#鼠标移动到“设置”按钮
mouse=driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(mouse).perform()
driver.find_element_by_link_text("搜索设置").click()
#通过索引:select_by_value()
s=driver.find_element_by_id("nx")
select(s).select_by_visible_text("每页显示50条") #通过text来定位,每页显示50条
(4)select模块其它方法:
deselect_all() :取消所有选项
deselect_by_index() :取消对应index选项
deselect_by_value() :取消对应value选项
deselect_by_visible_text() :取消对应文本选项
first_selected_option() :返回第一个选项
all_selected_options() :返回所有的选项
9.alert\confirm\prompt:
不是所有的弹出框都叫alert,在使用alert方法前,先要识别出到底是不是alert。
alert\confirm\prompt弹出框操作主要方法有:
text:获取文本值
accept() :点击"确认"
dismiss() :点击"取消"或者叉掉对话框
send_keys() :输入文本值 --仅限于prompt,在alert和confirm上没有输入框
(1)关于alert的操作:
1.先用switch_to_alert()方法切换到alert弹出框上
2.可以用text方法获取弹出的文本 信息
3.accept()点击确认按钮
4.dismiss()相当于点右上角x,取消弹出框(url的路径,直接复制浏览器打开的路径)
<例> #coding:utf-8
from selenium import webdriver
import time
url="file://c:/users/admin/Desktop/testalert.html"
driver=webdriver.Firefox()
driver.get(url)
time.sleep(4)
driver.find_element_by_id("alert").click()
time.sleep(3)
t=driver.switch_to_alert()
print t.text #打印警告框文本内容
t.accept() #点击警告框的确认按钮
#t.dismiss()相当于点击取消按钮
(2)关于confirm操作:
1.先用switch_to_alert()方法切换到alert弹出框上
2.可以用text方法获取弹出的文本 信息
3.accept()点击确认按钮
4.dismiss()相当于点取消按钮或点右上角x,取消弹出框(url的路径,直接复制浏览器打开的路径)
<例> #coding:utf-8
from selenium import webdriver
import time
url="file://c:/users/admin/Desktop/testalert.html"
driver=webdriver.Firefox()
driver.get(url)
time.sleep(4)
driver.find_element_by_id("confirm").click()
time.sleep(3)
t=driver.switch_to_alert()
print t.text #打印警告框文本内容
t.accept() #点击警告框的确认按钮
#t.dismiss()相当于点击取消按钮
(3)关于prompt操作:
1.先用switch_to_alert()方法切换到alert弹出框上
2.可以用text方法获取弹出的文本 信息
3.accept()点击确认按钮
4.dismiss()相当于点右上角x,取消弹出框
5.send_keys()这里多个输入框,可以用send_keys()方法输入文本内容(url的路径,直接复制浏览器打开的路径)
<例>coding:utf-8
from selenium import webdriver
import time
url="file:///c:/users/admin/Desktop/testalert.html"
driver=webdriver.Firefox()
driver.get(url)
time.sleep(5)
driver.find_element_by_id("prompt").click()
time.sleep(5)
t=driver.switch_to_alert()
#打印警告框文本内容
print t.text
t.send_keys("hello selenium2")
t.accept() #点击警告框的确认按钮
#t.dismiss()相当于点击取消按钮
10.select遇到的问题:
1.在操作百度设置里面,点击“保存设置”按钮时,alert弹出框没有弹出来。(Ie浏览器是可以的)
2.分析原因:经过慢慢调试后发现,在点击"保存设置"按钮时,由于前面的select操作后,失去了焦点
3.解决办法:在select操作后,做个click()点击操作。
11.单选框和复选框(radiobox、checkbox)的定位:
(1)全部勾选:
可以用到定位一组元素,复选框的type=checkbox,这里可以用xpath语法:.//*[@type='checkbox'];
find_elements是不能直接点击的,它是复数的,所以只能先获取到所有的checkbox对象,然后通过for循环
去一个个点击操作;
<例> #coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get("file:///C:/Users/Gloria/Desktop/checkbox.html")
checkboxs=driver.find_elements_by_xpath(".//*[@type='checkbox']")
for i in checkboxs:
i.click()
(2)判断是否选中:is_selected()
<例> # coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get("file:///C:/Users/Gloria/Desktop/checkbox.html")
#没点击操作前,判定选项框的状态
s=driver.find_element_by_id("boy").is_selected()
print s
driver.find_element_by_id("boy").click()
#点击后,判断元素是否为选中的状态
r=driver.find_element_by_id("boy").is_selected()
print r
12.table表格定位:
(1)table特征:
1.table页面查看源码一般有这几个明显的标签:table、tr、th、td
2.<table>标示一个表格
3.<tr>标示这个表格中间的一个行
4.</th> 定义表头单元格
5.</td> 定义单元格标签,一组<td>标签将将建立一个单元格,<td>标签必须放在<tr>标签内.
(2)表格的元素定位可以用xpath定位方式,比如:.//*[@id='myTable']/tbody/tr[2]/td[1]
需要说明的是,这里定位的格式是固定的,只需改tr和td后面的数字就可以了.如第二行第一列tr[2]td[1].
<例>from selenium import webdriver
url='file:///C:/Users/Gloria/Desktop/table.html'
driver=webdriver.Firefox()
driver.get(url)
t=driver.find_element_by_xpath(".//*[@id='myTable']/tbody/tr[2]/td[1]")
print t.text
13.加载Firefox配置:
(1)加载Chrome配置方法就是将username改成自己电脑的名字即可(不要用中文)
<例>'--user-data-dir=C:\Users\username\AppData\Local\Google\Chrome\User Data'
#coding:utf-8
from selenium import webdriver
#加载chrome配置
option=webdriver.ChromeOptions()
option.add_argument('--user-data-dir=C:\Users\Gloria\AppData\Local\Google\Chrome\User Data')
driver = webdriver.Chrome(chrome_options=option)
driver.implicitly_wait(30)
driver.get("http://www.cnblogs.com/yoyoketang/")
(2)wap测试:
<例>#coding:utf-8
from selenium import webdriver
option=webdriver.ChromeOptions()
#伪装iphone登录:
option.add_argment('--user-agent=iphone')
#伪装android登录:
option.add-argment('--user-agent=android')
driver=webdriver.Chrome(chrome_options=option)
driver.get('http://www.taobao.com')
14.富文本(richtext):
<例># coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
profileDir = r'C:\Users\Gloria\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'
profile = webdriver.FirefoxProfile(profileDir)
driver = webdriver.Firefox(profile)
bolgurl = "http://www.cnblogs.com/"
yoyobolg = bolgurl + "yoyoketang"
driver.get(yoyobolg)
driver.find_element_by_id("blog_nav_newpost").click()
time.sleep(5)
edittile = u"Selenium2+python自动化23-富文本"
editbody = u"这里是发帖的正文"
driver.find_element_by_id("Editor_Edit_txbTitle").send_keys(edittile)
driver.switch_to.frame("Editor_Edit_EditorBody_ifr")
driver.find_element_by_id("tinymce").send_keys(Keys.TAB)
driver.find_element_by_id("tinymce").send_keys(editbody)
15.非input文件上传(SendKeys):
(1)sendkeys安装步骤:
1.sendkeys安装:
输入命令:pip install sendkeys.
2.如果安装的时候报错:micsoft visual c++ is required.Get it from http://aka.ms/vcpython27.的时候,只需要按照 给定的路径http://aka.ms/vcpython27下载文件即可,然后一路安装即可。
3.如果出现successfully installed sendkeys_0.3字样的时候,则代表文件安装成功!
<例># coding:utf-8
from selenium import webdriver
import SendKeys
import time
# 加载Firefox配置
profileDir = r'C:\Users\xxxAppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'
profile = webdriver.FirefoxProfile(profileDir)
driver = webdriver.Firefox(profile)
# 加载Chrome配置
option = webdriver.ChromeOptions()
option.add_argument('--user-data-dir=C:\Users\xxxAppData\Local\Google\Chrome\User Data')
driver = webdriver.Chrome(chrome_options=option)
driver.implicitly_wait(30)
driver.get("http://www.cnblogs.com/yoyoketang/")
driver.find_element_by_link_text("新随笔").click()
time.sleep(3)
# 点开编辑器图片
driver.find_element_by_css_selector("img.mceIcon").click()
time.sleep(3)
# 定位所有iframe,取第二个
iframe = driver.find_elements_by_tag_name('iframe')[1]
# 切换到iframe上
driver.switch_to_frame(iframe)
# 文件路径
time.sleep(2)
driver.find_element_by_class_name("qq-upload-button").click()
# driver.find_element_by_name("file").click() # 这里点文件上传按钮也是一个坑,我用它父元素定位了,参 考上面一行
time.sleep(5)
# SendKeys方法输入内容
SendKeys.SendKeys("D:\\test\\jie1\\blog\\12.png") # 发送文件地址
time.sleep(1)
SendKeys.SendKeys("{ENTER}") # 发送回车键
time.sleep(1)
SendKeys.SendKeys("{ENTER}") # 因为我的电脑是搜索输入法,所以多按一次回车
driver.quit()
16.文件上传(send_keys):
文件上传是web页面上很常见的一个功能,一般分两个场景:一种是input标签,这种可以用selenium提供的send_keys()方法轻 松解决;另外一种非input标签实现起来比较困难,可以借助autoit工具或者SendKeys第三方库。
方法一:识别上传按钮
1.点开博客园编辑器里的图片上传按钮,弹出”上传本地图片”框。
2.用firebug查看按钮属性,这种上传图片按钮有个很明显的标识,它是一个input标签,并且type属性的值为file。只要 找到这两个标识,我们就可以直接用send_keys()方法上传文件了。
方法二:定位iframe
1.这里定位图片上传按钮情况有点复杂,首先它是在iframe上。
2.这个iframe的id是动态的,且没有name属性,其它属性也不是很明显。
3.通过搜索发现,这个页面上有两个iframe,需要定位的这个iframe是处于第二个位置。
4.可以通过标签定位所有的iframe标签,然后取对应的第几个就可以了。
<例> #coding:utf-8
from selenium import webdriver
import time
profileDir=r'C:\Users\Gloria\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'
profile=webdriver.Firefoxprofile(profiledir)
driver=webdriver.Firefox(profile)
driver.implicitly_wait(30)
driver.get("http://www.cnblogs.com/yoyoketang/")
driver.find_element_by_link_text("新随笔").click()
time.sleep(3)
#点开编辑图片
driver.find_element_by_css_selector("img.mceIcon").click()
time.sleep(3)
#定位所有的iframe,取第二个
iframe=driver.find_elements_by_tag_name('iframe')[1]
#切换到iframe上
driver.switch_to_frame(iframe)
#文件路径
driver.find_element_by_name('file').send_keys
17.获取元素属性;
(1)title的获取方法;
<例> #coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.implicitly_wait(10)
driver.get(“http:www.baidu.com”)
time.sleep(2)
title=driver.title
print title
(2)通过driver.text获取到文本;
<例> #coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.implicitly_wait(10)
driver.get(“http:www.baidu.com”)
time.sleep(2)
title=driver.title
print title
text=driver.find_element_by_id(“setf”).text
print text
(3)获取元素的标签
<例>获取百度输入框的标签属性
tag=driver.find_element_by_id(“kw”).tag_name
print tag
(4)获取元素的其它属性;
获取其它属性方法:get_attribute("属性"),这里的参数可以是class、name等任意属性.
<例>获取百度输入框的class属性;
name=driver.find_element_by_id(“kw”).get_attribute(“class”)
print name
(5)获取输入框内的文本值;
如果在百度输入框输入了内容,这里输入框的内容也是可以获取到的.
<例>获取百度输入框的内容;
driver.find_element_by_id(“kw”).send_keys(“yoyoketang”)
value=drvier.find_element_by_id(“kw”).get_attribute(“value”)
print value
(6)获取浏览器名称;获取浏览器名称很简单,用driver.name就能获取到.
<例>#coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.implicitly_wait(10)
driver.get(“http:www.baidu.com”)
time.sleep(2)
title=driver.title
print title
print driver.name
18.爬页面源码(page_source)
(1)有时候通过元素的属性的查找页面上的某个元素,可能不太好找,这时候可以从selenium的page_source方法可以获取到页 面源码。
<例>#coding:utf-8
from selenium import webdriver
import re
driver=webdriver.Firefox()
driver.get(“http://www.cnblogs.com/yoyoketang/”)
page=driver.page_source
print page
(2)re非贪婪模式:
1.这里需导入re模块(正则表达式模块)
2.用re的正则匹配:非贪婪模式
3.findall方法返回的是一个list集合
4.匹配出来之后发现有一些不是url链接,可以筛选下
#“非贪婪匹配”,re.s('.'匹配字符,包括换行符)”
url_list=re.findall('href=\"(.*?)\"',page,re.s)
for url in url_list:
print url
(3)筛选url地址出来
1.加个if语句判断,‘http’在url里面说明是正常的url地址了
2.把所有的url地址放到一个集合,就是我们想要的结果啦.
#“非贪婪匹配”,re.s('.'匹配字符,包括换行符)”
url_list=re.findall('href=\"(.*?)\"',page,re.s)
url_all=[]
for url in url_list:
if "http" in url:
print url
url_all.append(url)
print url_all
19.cookie相关操作:
(1)获取cookies:get_cookies()
1.获取cookies方法直接用:get_cookies()
2.先启动浏览器,获取cookies,打印出来发现是空:[]
3.打开博客首页后,重新获取cookies,打印出来,就有值了.
<例># coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
#启动浏览器后获取cookies
print driver.get_cookies()
driver.get("http://www.cnblogs.com/yoyoketang/")
#打开主页后获取cookies
print driver.get_cookies()
(2)登录后的cookies:
1.先登录博客园(这里登录用自己的账号和密码吧)
2.重新获取cookies,发现跟之前获取的不一样了
3.主要是找到这一个cookie,发现它的name和value发生了变化,这就是未登录和已登录的区别了(对比上下两张图)
{u'name': u'.CNBlogsCookie', u'value': u'B7813EBA142142CE88CC8C0B33B239F566xxxx'}
<例>
#登录后获取cookies
url="https://passport.cnbblogs.com/user/signin"
driver.get(url)
driver.implicitly_wait(30)
driver.find_element_by_id("input1").send_keys(u"上海—悠悠")
driver.find_element_by_id("input2").send_keys(u"xxxxx")
driver.find_element_by_id("signin").click()
time.sleep(3)
print driver.get_cookies()
(3)获取指定name的cookie:driver.get_cookie(name)
1.获取cookies发现里面有多个cookie,有时候我们只需要其中的一个,把重要的提出来,比如登录的cookie
2.这里用get_cookie(name),指定对应的cookie的name值就行了,比如博客园的:.CNBlogsCookie
<例># 获取指定的name的cookie
print driver.get_cookie(name=".CNBlogsCookie")
(4)清除指定cookie:delete_cookie()
1.为了进一步验证上一步获取到的就是登录的cookie,可以删除它看看页面什么变化
2.删除这个cookie后刷新页面,发现刚才的登录已经失效了,变成未登录状态了
<例># 清除指定name的cookie
driver.delete_cookie(name="CNBlogsCookie")
print driver.get_cookies()
# 为了验证此cookie是登录的,可以删除后刷新页面
driver.refresh()
(5)清除所有cookies:delete_all_cookies()
清除所有cookies后登录状态也失效了,cookies为空[];
<例># 清除所有的cookie
driver.delete_all_cookies()
print driver.get_cookies()
(6)cookie操作的几个方法
1.get_cookies():获取所有cookies
2.driver.get_cookie(name):获取指定name的cookie:
3.清除指定cookie:delete_cookie()
4.delete_all_cookies():清除所有cookies
5.add_cookie(cookie_dict):添加cookie的值
20.绕过验证码(add_cookie);
验证码这种问题是比较头疼的,对于验证码的处理,不要去想破解方法,这个验证码本来就是为了防止别人自动化登录的。如果 你能破解,说明你们公司的验证码吗安全级别不高,那就需要提高级别了。
对于验证码,要么是让开发在测试环境弄个万能的验证码,如:1234,要么就是尽量绕过去,如本篇介绍的添加cookie的方法。
一、fiddler抓包
1.前一篇讲到,登录后会生成一个已登录状态的cookie,那么只需要直接把这个值添加到cookies里面就可以了。
2.可以先手动登录一次,然后抓取这个cookie,这里就需要用抓包工具fiddler了
3.先打开博客园登录界面,手动输入账号和密码(不要点登录按钮)
4.打开fiddler抓包工具,此时再点博客园登录按钮
5.登录成功后,再查看cookie变化,发现多了两组参数,多的这两组参数就是我们想要的,copy出来,一会有用
二.添加cookie方法:driver.add_cookie()
1.add_cookie(cookie_dict)方法里面参数是cookie_dict,说明里面参数是字典类型。
2.源码官方文档介绍:
add_cookie(self, cookie_dict):
Adds a cookie to your current session.
:Args:
- cookie_dict: A dictionary object, with required keys - "name" and "value";
optional keys - "path", "domain", "secure", "expiry"
Usage:
driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True})
3.从官方的文档里面可以看出,添加cookie时候传入字典类型就可以了,等号左边的是name,等号右边的是value。
4.把前面抓到的两组数据(参数不仅仅只有name和value),写成字典类型:
{'name':'.CNBlogsCookie','value':'2C3AE01E461B2D2F1572D02CB936D77A053089AA2xxxx...'}
{'name':'.Cnblogs.AspNetCore.Cookies','value':'CfDJ8Mmb5OBERd5FqtiQlKZZIG4HKz_Zxxx...'}
三、cookie组成结构
1.用抓包工具fidller只能看到cookie的name和value两个参数,实际上cookie还有其它参数。
2.cookie参数组成,以下参数是我通过get_cookie(name)获取到的。
cookie ={u'domain': u'.cnblogs.com',
u'name': u'.CNBlogsCookie',
u'value': u'xxxx',
u'expiry': 1491887887,
u'path': u'/',
u'httpOnly': True,
u'secure': False}
name:cookie的名称
value:cookie对应的值,动态生成的
domain:服务器域名
expiry:Cookie有效终止日期
path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie
httpOnly:防脚本攻击
secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,
浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS。
四、添加cookie
1.这里需要添加两个cookie,一个是.CNBlogsCookie,另外一个是.Cnblogs.AspNetCore.Cookies。
2.我这里打开的网页是博客的主页:http://www.cnblogs.com/yoyoketang,没进入登录页。
3.添加cookie后刷新页面,接下来就是见证奇迹的时刻了。
# coding:utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.cnblogs.com/yoyoketang")
# 添加cookie
c1 = {u'domain': u'.cnblogs.com',
u'name': u'.CNBlogsCookie',
u'value': u'xxxx',
u'expiry': 1491887887,
u'path': u'/',
u'httpOnly': True,
u'secure': False}
c2 = {u'domain': u'.cnblogs.com',
u'name': u'.Cnblogs.AspNetCore.Cookies',
u'value': u'xxxx',
u'expiry': 1491887887,
u'path': u'/',
u'httpOnly': True,
u'secure': False}
driver.add_cookie(c1) # 添加2个值
driver.add_cookie(c2)
time.sleep(3) # 交流QQ群:232607095
# 刷新下页面就见证奇迹了
driver.refresh()
有几点需要注意:
1.登录时候要勾选下次自动登录按钮。
2.add_cookie()只添加name和value,对于博客园的登录是不成功。
3.本方法并不适合所有的网站,一般像博客园这种记住登录状态的才会适合。
21 JS处理滚动条;
selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了。比如下面的场景:
当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的。这时候需要借助滚动条来拖动 屏幕,使被操作的元素显示在当前的屏幕上。滚动条是无法直接用定位工具来定位的。selenium里面也没有直接的方法去控制 滚动条,这时候只能借助J了,还好selenium提供了一个操作js的方法:execute_script(),可以直接执行js的脚本。
一、JavaScript简介
JavaScript是世界上最流行的脚本语言,因为你在电脑、手机、平板上浏览的所有的网页,以及无数基于HTML5的手机App, 交互逻辑都是由JavaScript驱动的。简单地说,JavaScript是一种运行在浏览器中的解释型的编程语言。
(参考链接;http://www.w3school.com.cn/js/index.asp4)
二、控制滚动条高度
1.滚动条回到顶部:
js="var q=document.getElementById('id').scrollTop=0"
driver.execute_script(js)
2.滚动条拉到底部;
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
3.这里可以修改scrollTop 的值,来定位右侧滚动条的位置,0是最上面,10000是最底部。
三、横向滚动条
1.有时候浏览器页面需要左右滚动(一般屏幕最大化后,左右滚动的情况已经很少见了)。
2.通过左边控制横向和纵向滚动条;
scrollTo(x, y)js = "window.scrollTo(100,400);"
driver.execute_script(js)
3.第一个参数x是横向距离,第二个参数y是纵向距离
四、Chrome浏览器
1.以上方法在Firefox上是可以的,但是用Chrome浏览器,发现不管用。
2.Chrome浏览器解决办法:
js = "var q=document.body.scrollTop=0"
driver.execute_script(js)
五、元素聚焦
1.虽然用上面的方法可以解决拖动滚动条的位置问题,但是有时候无法确定我需要操作的元素在什么位置,有可能每次打开 的页面不一样,元素所在的位置也不一样,怎么办呢?
2.这个时候我们可以先让页面直接跳到元素出现的位置,然后就可以操作了。同样需要借助JS去实现。
3.元素聚焦:
target = driver.find_element_by_xxxx()
driver.execute_script("arguments[0].scrollIntoView();", target)
六、获取浏览器名称:driver.name
1.为了解决不同浏览器操作方法不一样的问题,可以写个函数去做兼容。
2.先用driver.name获取浏览器名称,然后用if语句做个判断
# coding:utf-8
from selenium import webdriver
driver=webdriver.Firefox()
driver.get(“https://www.baidu.com”)
print driver.name
七、兼容性
1.兼容谷歌和firefox/IE
#回到顶部
def scroll_top():
if driver.name=="chrome"
js="var q=document.body.scrollTop=0"
else:
js="var q=document.documentElement.scrollTop=0"
return driver.execute_script(js)
#拉到底部
def scroll_foot():
if driver.name=="chrome"
js="var q=document.body.scrollTop=10000"
else:
js="var q=document.documentElement.scrollTop=10000"
return driver.execute_script(js)
八、scrollTo函数
--scrollHeight 获取对象的滚动高度。
--scrollLeft 设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离。
--scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。
--scrollWidth 获取对象的滚动宽度。
scrollTo函数不存在兼容性问题,直接用这个函数就可以了;
#滚动到底部
js = "window.scrollTo(0,document.body.scrollHeight)"
driver.execute_script(js)
#滚动到顶部
js = "window.scrollTo(0,0)"
driver.execute_script(js)
22.JS处理富文本;
一、加载配置
1.打开博客园写随笔,首先需要登录,这里为了避免透露个人账户信息,我直接加载配置文件,免登录了。
不懂如何加载配置文件的,看加载firefox配置.
# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import keys
import time
profileDir=r'C:\xxx...\Firefox\profiles\1x41j9of.default'
profile=webdriver.Firefoxprofile(profileDir)
driver=webdriver.Firefox(profile)
二、打开编辑界面
1.博客首页地址:bolgurl = "http://www.cnblogs.com/"
2.我的博客园地址:yoyobolg = bolgurl + "yoyoketang"
3.点击“新随笔”按钮,id=blog_nav_newpost
bolgurl= "http://www.cnblogs.com/"
yoyobolg = bolgurl + "yoyoketang"
driver.get(yoyobolg)
driver.find_element_by_id("blog_nav_newpost").click()
三、定位iframe
1.打开编辑界面后先不要急着输入内容,先sleep几秒钟
2.输入标题,这里直接通过id就可以定位到,没什么难点
3.接下来就是重点要讲的富文本的编辑,这里编辑框有个iframe,所以需要先切换
四、js输入中文
1.这里定位编辑正文是定位上图的红色框框位置body部分,也就是id=tinymce
2.定位到之后,用js的方法直接输入,无需切换iframe
3.直接点保存按钮,无需再切回来.
<完整代码>
# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# profileDir路径对应直接电脑的配置路径
profileDir = r'C:\xxx\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'
profile = webdriver.FirefoxProfile(profileDir)
driver = webdriver.Firefox(profile)
bolgurl = "http://www.cnblogs.com/"
yoyobolg = bolgurl + "yoyoketang"
driver.get(yoyobolg)
driver.find_element_by_id("blog_nav_newpost").click()
time.sleep(5)
edittile = u"Selenium2+python自动化23-富文本"
editbody = u"这里是发帖的正文"
driver.find_element_by_id("Editor_Edit_txbTitle").send_keys(edittile)
body = "这里是通过js发的正文内容"
# js处理iframe问题(js代码太长了,我分成两行了)
js = 'document.getElementById("Editor_Edit_EditorBody_ifr")' \
'.contentWindow.document.body.innerHTML="%s"' % body
driver.execute_script(js)
# 保存草稿
driver.find_element_by_id("Editor_Edit_lkbDraft").click()
23 js处理日历控件(修改readonly属性);
<完整代码>
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://kyfw.12306.cn/otn/index/init")
# 去掉元素的readonly属性
js = 'document.getElementById("train_date").removeAttribute("readonly");'
driver.execute_script(js)
# 用js方法输入日期
js_value = 'document.getElementById("train_date").value="2016-12-25"'
driver.execute_script(js_value)
# # 清空文本后输入值
# driver.find_element_by_id("train_date").clear()
# driver.find_element_by_id("train_date").send_keys("2016-12-25")
24.js处理内嵌div滚动条;
一.纵向滚动;
1.这个是div的属性:<div id="yoyoketang" name="yoyo" class="scroll">
2.这里最简单的通过id来定位,通过控制 scrollTop的值来控制滚动条高度
3.运行下面代码,观察页面是不是先滚动到底部,过五秒再回到顶部。(get里面地址 是浏览器打开该页面的地址)
<例># coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get("file:///C:/Users/Gloria/Desktop/div.html")
# 纵向底部
js1=‘document.getElementById("yoyoketang").scrollTop=10000’
driver.execute_script(js1)
time.sleep(5)
# 纵向顶部
js1=‘document.getElementById("yoyoketang").scrollTop=0’
driver.execute_script(js1)
二.横向滚动;
先通过id来定位,通过控制scrollLeft的值来控制滚动条高度.
<例># coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get("file:///C:/Users/Gloria/Desktop/div.html")
# 横向右侧
js3=‘document.getElementById("yoyoketang").scrollLeft=10000’
driver.execute_script(js3)
time.sleep(5)
# 横向左侧侧
js4=‘document.getElementById("yoyoketang").scrollLeft=0’
driver.execute_script(js4)
三.用class属性定位;
js用class属性定位,返回的是一个list对象,这里取第一个就可以了。
注意;element和elements是不一样的.
<例> # coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get("file:///C:/Users/Gloria/Desktop/div.html")
# 获取的class返回的是list对象,取list的第一个
js5=‘document.getElementsByClassName("scroll") [0].scrollTop=10000’
driver.execute_script(js5)
time.sleep(5)
# 控制横向滚动条位置
js6=‘document.getElementsByClassName("scroll") [0].scrollLeft=10000’
driver.execute_script(js6)
有时候很多元素属性都一样时候,就可以用复数定位,取对应的第几个就可以了。
25 js处理多窗口;
js去掉target="_blank"属性
1.第一步为了先登录,我这里加载配置文件免登录了.
2.这里用到js的定位方法,定位该元素的class属性
3.定位到该元素后直接修改target属性值为空.
<例># coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# 加载配置文件免登录
profileDir = r'C:\Users\Gloria\AppData\Roaming\Mozilla\Firefox \Profiles\1x41j9of.default'
profile = webdriver.FirefoxProfile(profileDir)
driver = webdriver.Firefox(profile)
driver.get("https://www.baidu.com/")
# 修改元素的target属性
js = 'document.getElementsByClassName("mnav")[0].target="";'
driver.execute_script(js)
driver.find_element_by_link_text("糯米").click()
(注意:并不是所有的链接都适用于本方法,本篇只适用于有这个target="_blank" 属性链接情况。)
26 js解决click失效问题:
<例># coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select
import time
driver = webdriver.Firefox()
url = "https://www.baidu.com"
driver.get(url)
time.sleep(3)
mouse = driver.find_element("link text", "设置")
ActionChains(driver).move_to_element(mouse).perform()
time.sleep(3)
driver.find_element("link text", "搜索设置").click()
time.sleep(3)
s = driver.find_element("id", "nr")
Select(s).select_by_visible_text("每页显示50条")
# 方法一:先点父元素 交流QQ群:232607095
# driver.find_element("id", "gxszButton").click()
# driver.find_element("class name", "prefpanelgo").click()
# 方法二:用js直接去点击 .
js = 'document.getElementsByClassName("prefpanelgo")[0].click();'
driver.execute_script(js)
27.18种定位方法总结:
一、十八种定位方法:
(1)常用的八种元素定位方式:
1.id定位:find_element_by_id(self, id_)
2.name定位:find_element_by_name(self, name)
3.class定位:find_element_by_class_name(self, name)
4.tag定位:find_element_by_tag_name(self, name)
5.link定位:find_element_by_link_text(self, link_text)
6.partial_link定位find_element_by_partial_link_text(self, link_text)
7.xpath定位:find_element_by_xpath(self, xpath)
8.css定位:find_element_by_css_selector(self, css_selector)
(2)这八种是复数形式;
9.id复数定位find_elements_by_id(self, id_)
10.name复数定位find_elements_by_name(self, name)
11.class复数定位find_elements_by_class_name(self, name)
12.tag复数定位find_elements_by_tag_name(self, name)
13.link复数定位find_elements_by_link_text(self, text)
14.partial_link复数定位find_elements_by_partial_link_text(self, link_text)
15.xpath复数定位find_elements_by_xpath(self, xpath)
16.css复数定位find_elements_by_css_selector(self, css_selector)
(3)这两种就是快失传了的;
17.find_element(self, by='id', value=None)
18.find_elements(self, by='id', value=None)
二、element和elements傻傻分不清
1.element方法定位到是是单数,是直接定位到元素
2.elements方法是复数,这个学过英文的都知道,定位到的是一组元素,返回的是 list队列.
3.可以用type()函数查看数据类型.
<参考代码>
# coding:utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 这里是定位的单个id
element = driver.find_element_by_id("kw")
print type(element)
print element
# 这里定位是多个class
elements = driver.find_elements_by_class_name("mnav")
print type(elements)
print elements
# 这里用的css语法
s = driver.find_elements("css selector", ".mnav")
# '地图'在第四个位置
print s[3].text
s[3].click()
# 这个写法也是可以的
# driver.find_elements("css selector", ".mnav")[3].click()
28.查看webdriver API(带翻译)
一、pydoc
1.到底什么是pydoc? ,这个是准确的解释:Documentation generator and online help system. pydoc是Python自带的模块,主要用于从python模块中自动生成文 档,这些文档可以基于文本呈现的、也可以生成WEB页面的,还可以在服务器上以 浏览器的方式呈现!简而言之,就是帮你从代码和注释自动生成文档的工具。
2.举个栗子,我需要查看python里面open函数的功能和语法,打开cmd,输入:python -m pydoc open
3.-m参数:python以脚本方法运行模块;
>>python -m pydoc open
二、启动server;
1.打开cmd命令行,输入:python -m pydoc -p 6666
2.-p参数:这个表示在本机上启动服务
3.6666参数:这个是服务端口号,随意设置
打开后,界面会出现一个地址:http://localhost:6666/,在浏览器直接打开。
三、浏览器查看文档
1.在浏览器输入:http://localhost:6666/
2.Built-in Moudles :这个是python自带的模块.
四、webdriver API:
1.找到这个路径:python2.7\lib\site-packages,点开selenium
2.打开的selenium>webdriver>firefox>webdriver,最终路径: http://localhost:6666/selenium.webdriver.firefox.webdriver.html
3.最终看到的这些就是selenium的webdriver API帮助文档啦.
29.练习题;
一.去掉页面动态窗.
1、alert弹窗;
这种弹窗是最简单的一种,Selenium里有自带的方法来处理它,用switch_to.alert 先定位到弹窗,然后使用一系列方法来操作:
accept - 点击【确认】按钮
dismiss - 点击【取消】按钮(如有按钮)
send_keys - 输入内容(如有输入框)
这里举一个菜鸟教程上的一个例子:
http://www.runoob.com/try/try.php?filename=tryjs_alert,
在页面左边点击【显示警告框】就会弹出一个alert弹窗:
我们用以下代码就能实现切换至弹窗并点击【确定】按钮的效果:
al = driver.switch_to_alert() al.accept()
这里这个switch_to_alert()其实是旧写法,照理应该是用switch_to.alert(),但是 新写法却会报错,目前猜测是版本问题,可能不支持新写法,这里就先用旧写法。
<例># encoding:utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.runoob.com/try/try.php?filename=tryjs_alert") driver.switch_to.frame("iframeResult")
driver.find_element_by_xpath("html/body/input").click()
time.sleep(1) al = driver.switch_to_alert()
time.sleep(1) al.accept()
2、自定义弹窗
由于alert弹窗不美观,现在大多数网站都会使用自定义弹窗,使用Selenium自带的 方法就驾驭不了了,此时就要搬出JS大法。这里举一个新世界教育官网首页的例子 (http://sh.xsjedu.org):
<例># encoding:utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://sh.xsjedu.org/")
time.sleep(1)
js='document.getElementById ("doyoo_monitor").style.display="none";'
driver.execute_script(js)
二.定位百度-更多产品;
<例># coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Firefox()
url = "https://www.baidu.com"
driver.get(url)
driver.maximize_window()
time.sleep(2)
e = driver.find_element_by_link_text("更多产品")
ActionChains(driver).move_to_element(e).perform()
time.sleep(1)
# ele = driver.find_element_by_name("tj_more")
# 经确认,是可以定位到元素的
# print ele.text
# 这一步点击失效了
# ele.click()
# js大法好,完美解决ckick失效问题
js = "document.getElementsByName('tj_more')[0].click()"
driver.execute_script(js)
三.获取百度联系词;
(1)定位输入框联想词
1.首先在百度输入框输入关键词,如:博客,然后输入框下方会自动匹配出关键词。
2.这时候可以用firebug工具定位到联想出来的词,可以看到下方匹配出来的词都有共同的class属性,这时候就可以全部定 位到了。
(2)打印全部匹配出来的词,可以通过get_attribute()方法获取到文本信息
(3)点击其中一个
1.点击其中的一个联想词,如:第二个
2.这里可以先加一个判断,如果获取到了就点击,没获取到就不点击了,以免抛异常。
(如果想依次点击,用for循环就可以了)
<例>
# coding:utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
time.sleep(1)
driver.find_element_by_id("kw").send_keys(u"博客")
# 获取百度输入框的
time.sleep(1)
bd = driver.find_elements_by_class_name("bdsug-overflow")
for i in bd:
print i.get_attribute("data-key")
# 点击其中的一个,如:第二个
if len(bd) > 1:
bd[1].click()
# 打印当前页面url
print driver.current_url
else:
print "未获取到匹配的词"
30.js几种定位方法总结;
一、以下总结了5种js定位的方法
除了id是定位到的是单个element元素对象,其它的都是elements返回的是list对象.
1.通过id获取
document.getElementById(“id”)
2.通过name获取
document.getElementsByName(“Name”)
返回的是list
3.通过标签名选取元素
document.getElementsByTagName(“tag”)
4.通过CLASS类选取元素
document.getElementsByClassName(“class”)
兼容性:IE8及其以下版本的浏览器未实现getElementsByClassName方法
5.通过CSS选择器选取元素
document.querySelectorAll(“css selector")
兼容性:IE8及其以下版本的浏览器只支持CSS2标准的选择器语法
二、id定位
1.定位博客首页的管理按钮:id="blog_nav_contact"
2.js的定位语法里面id定位获取的是单个元素对象,可以直接用click()方法点击元素.
三、class定位
1.js里面class定位获取到是是一个list列表对象.
2.操作元素的话通过下标取对应的第几个值,如果只用一个那就取下标[0].
3.定位到输入框,可以直接用value="xxx"方法输入内容.
4.ByName和ByTagName跟上面class一样,都是定位的一组元素.
四、CSS选择器
1.css选择器定位到的也是一组元素,语法跟前面学到的css语法是一样的.
<例>
# coding: utf-8
from selenium import Webdriver
import time
driver = webdriver.Firefox()
driver.get("http://cnblogs.com/yoyoketang")
#定位首页管理按钮:id=blog_nav_contact
js1 = 'document.getElementById("blog_nav_contact")'.click;'
driver.execute_script(js1)
#输入账号
js2 = 'document.getElementsByClassName("input-text")[0].value="悠悠";'
driver.execute_script(js2)
#输入密码
js3 = 'document.getElementsByClassName("input-text")[1].value="xxx";'
driver.execute_script(js3)
#勾选记住密码
js4 = 'document.getElementsByName("remember_me")[0].click();'
driver.execute_script(js4)
#点击登录按钮
js5 = 'document.querySelectorAll(#signin)[0].click();'
driver.execute_script(js5)
31.定位的坑:class属性有空格.
有些class属性中间有空格,如果直接复制过来定位是会报错的InvalidSelectorException: Message:
The given selector u-label f-dn is either invalid or does not result in a WebElement. The following error occurred:
InvalidSelectorError: Compound class names not permitted.这个报错意思是说定位语法错了。
一、定位带空格的class属性
1.以126邮箱为例:http://mail.126.com/,定位账号输入框.
2.如果直接复制过来用class属性定位是会报错的.
二、class属性科普
1.class属性中间的空格并不是空字符串,那是间隔符号,表示的是一个元素有多个class的属性名称,在整个HTML文档 ,使用CSS中的同一个class类可能是一个或多个!
(class属性是比较特殊的一个,除了这个有多个属性外,其它的像name,id是没多个属性的)
2.想补习html基础知识的可以参考菜鸟教程:http://www.runoob.com/html/html-attributes.html
三、class定位
既然知道class属性有空格是多个属性了,那定位的时候取其中的一个就行(并且要唯一),也就是说class="j- inputtext dlemail",取j-inputtext 和dlemail都是可以的,这样这个class属性在页面上唯一就行.
那么问题来了:如何才知道这个元素的某个属性是不是在页面上是唯一的呢?
四、判断元素唯一性
F12切换到HTML界面,在搜索框输入关键字搜索,如:j-inputtext,然后按回车搜索,看页面上有几个class属性中有 j-inputtext这个属性的,就知道是不是唯一的了。
五、class属性不唯一怎么办
如果这个class的多个属性都不是唯一的咋办呢,元素不唯一也不用怕,可以用复数定位,把所有的相同元素定位出来 ,按下标取第几个就行。
六、css定位
1.css来定位class属性的元素前面加个点(.)就行,然后空格变成点(.)就能定位了.
2.当然css也可以取class属性的其中一个属性(页面上唯一的)来定位,定位方法是灵活多变的.
<参考代码>
# coding:utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://mail.126.com/")
driver.implicitly_wait(20)
driver.switch_to.frame("x-URS-iframe")
# 方法一:取单个class属性
driver.find_element_by_class_name("dlemail").send_keys("yoyo")
driver.find_element_by_class_name("dlpwd").send_keys("12333")
# 方法二:定位一组取下标定位(乃下策)
# driver.find_elements_by_class_name("j-inputtext")[0].send_keys("yoyo")
# driver.find_elements_by_class_name("j-inputtext")[1].send_keys("12333")
# 方法三:css定位
# driver.find_element_by_css_selector(".j-inputtext.dlemail").send_keys("yoyo")
# driver.find_element_by_css_selector(".j-inputtext.dlpwd").send_keys("123")
# 方法四:取单个class属性也是可以的
# driver.find_element_by_css_selector(".dlemail").send_keys("yoyo")
# driver.find_element_by_css_selector(".dlpwd").send_keys("123")
32.jquery定位(简直逆天)
一、jquery搜索元素;
1.按F12进控制台
2.点全部按钮
3.右侧如果没出现输入框,就点下小箭头按钮
4.输入框输入jquery定位语法,如:$("#input1")
5.点运行按钮
6.左边会出现定位到的元素,如果有多个会以list列表的形式展示出。
二、jquery定位语法;
1.jquery语法可以学下w3school的教程:http://www.w3school.com.cn/jquery/jquery_syntax.asp
2.格式如下:
$(selector).action()
--selector:这里的定位语法和css的定位语法是一致的,如:id就是#,class就是点(.),tag标签名前面就无符号
--action:这个是定位元素之后的操作行为事件,如click.
三、jquery行为;
1.发送文本语法:$(selector).val(输入文本的值)
2.清空文本语法:$(selector).val('') # 空字符串,两个单引号
3.点击按钮:$(selector).click()
<参考代码>
# coding:utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("https://passport.cnblogs.com/user/signin")
driver.implicitly_wait(20)
# 输入账号
username = "$('#input1').val('上海-悠悠')"
driver.execute_script(username)
# 清空文本
# time.sleep(5)
# clear = "$('#input1').val('')"
# driver.execute_script(clear)
# 输入密码
psw = "$('#input2').val('yoyo')"
driver.execute_script(psw)
# 点击登录按钮
button = "$('#signin').click()"
driver.execute_script(button)