selenium自动化测试:4.webdriverAPI webdriver的使用方法(控制浏览器操作)慢慢更新……

selenium自动化测试

  • 四、webdriverAPI
    • 4.1 定位元素
    • 4.2 控制浏览器
    • 4.3简单元素操作
    • 4.4鼠标事件
    • 4.5键盘事件
    • 4.6获得验证信息
    • 4.7设置元素等待
    • 4.8定位一组元素
    • 4.9多表单切换
    • 4.10多窗口切换
    • 4.11警告框处理
    • 4.12上传文件
    • 4.13下载文件
    • 4.14操作Cookie
    • 4.15调用JavaScript
    • 4.16处理H5视频播放
    • 4.17窗口截图
    • 4.18关闭窗口
    • 4.19处理验证码
    • 4.20webdriver原理(待更新……)

四、webdriverAPI

使用webdriverAPI中的方法实现对浏览器的操作。

4.1 定位元素

定位元素主要有以下八种方法,最后两种比较重要:

  1. find_element_by_id();
  2. find_element_by_name();
  3. find_element_by_class_name();
  4. findelement_by_tag_name();
  5. find_element_by_link_text();
  6. find_element_by_partial_link_text();
  7. find_element_by_xpath();
  8. find_element_by_css_selector()
'''
Created on 2019年11月16日

@author: Yue
@attention: 界面元素定位方法(8种),注意xpath和css_selector定位写法
@note: 1.find_element_by_id();2.find_element_by_name();3.find_element_by_class_name();4.findelement_by_tag_name();5.find_element_by_link_text();6.find_element_by_partial_link_text();7.find_element_by_xpath();8.find_element_by_css_selector()
'''
#coding=UTF-8
from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get("http://www.baidu.com")

# 4.1.1_id定位:kw-百度输入框id;su-百度搜索按钮id
browser.find_element_by_id("kw")
browser.find_element_by_id("su")

# 4.1.2_name定位:wd-百度输入框name
browser.find_element_by_name("wd")

# 4.1.3_class定位:s_ipt-百度输入框;;bg sbtn-百度搜索按钮(空格表示类名父子关系)
browser.find_element_by_class_name("s_ipt")
browser.find_element_by_class_name("bg sbtn")

# 4.1.4_tag(标签名)定位:输入框和按钮都是input标签
browser.find_element_by_tag_name("input")

# 4.1.5_link定位:通过链接文字定位
browser.find_element_by_link("新闻")
browser.find_element_by_link("hao123")
browser.find_element_by_link("地图")
browser.find_element_by_link("视频")
browser.find_element_by_link("贴吧")

# 4.1.6_partial_link定位:较长的链接文字,通过部分文字定位
browser.find_element_by_link("一个很长的")
browser.find_element_by_link("文本链接")


# 4.1.7_Xpath定位:~是xml文档定位元素的语言。分别定位输入框和搜索按钮
# 1、tag绝对路径定位
browser.find_element_by_xpath("/html/body/div/div/[2]/div/div/div/form/span/input") #中括号数字表示同级标签的第几个
browser.find_element_by_xpath("/html/body/div/div/[2]/div/div/div/form/span[2]/input")
# 2、元素属性定位
# id属性定位
browser.find_element_by_xpath("//input[@id='kw']") #//表示为当前页面某个目录下;@后接id、class或type等等属性,同样,属性值空格表示层级选择
browser.find_element_by_xpath("//input[@id='su']")
# class属性定位
browser.find_element_by_xpath("//input[@class='wd']") 
browser.find_element_by_xpath("//input[@class='s_ipt']")#也可不指定标签名,用“*”代替,如下一行
browser.find_element_by_xpath("//*[@class='bg s_ipt']")
#层级与属性结合
browser.find_element_by_xpath("//form[@id='form']/span/input")
browser.find_element_by_xpath("//form[@id='for,']/span[2]/input")
# 逻辑运算符and
browser.find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")


# 4.1.8_CSS定位:css可以较为灵活地选择控件的任意属性,一般情况下定位速度要比xpath快。分别定位输入框和搜索按钮
'''
一些css选择器

*    所有元素
.intro    class选择器:类名为intro的所有元素(标签)
#firstname    id选择器:id为firstname的所有元素
span    tag选择器:所有span标签元素
div>input    后代选择器:父元素为div的所有input元素(>和空格一样的效果)
div+input    下一个兄弟选择器:选择和div同级且紧挨的第一个input
[target=_blank]    属性选择器:选择target属性值为_blank的所有元素
div.intor(input)#su    交集选择器:不带空格,和层级选择区分。标签名为div和类名为intro的交集元素,可无限添加交集,通常每个类名或id都带上所属标签(不常用)

'''
# 1、通过class属性定位
browser.find_element_by_css_selector(".s_ipt")
browser.find_element_by_css_selector(".bg s_btn")
# 2、通过id属性定位
browser.find_element_by_css_selector(".#kw")
browser.find_element_by_css_selector("#su")
# 3、通过tag名称定位
browser.find_element_by_css_selector("input")
# 4、通过父子关系定位
browser.find_element_by_css_selector("span > input")
browser.find_element_by_css_selector("form span input")
# 5、通过属性定位
browser.find_element_by_css_selector("[autocomplete = off]")
browser.find_element_by_css_selector("[name = 'kw']")
browser.find_element_by_css_selector('[type = "submit"]')#属性值的引号可加可不加,内外引号的顺序也不要求
# 6、通过组合定位——疑问:属性能否和标签、class、id进行组合???
browser.find_element_by_css_selector("form.fm > span > input.s_ipt")
browser.find_element_by_css_selector("form#form span input#kw")


# 4.1.9_By定位元素:直接使用“find_element()",通过By声明定位方法,传入定位参数。(本质上和前8种是同一种实现,第九种是前八种的底层实现)
browser.find_element(By.ID, "kw")
browser.find_element(By.NAME, "wd")
browser.find_element(By.CLASS_NAME, "s_ipt")
browser.find_element(By.TAG_NAME, "input")
browser.find_element(By.LINK_TEXT, "新闻")
browser.find_element(By.PARTIAL_LINK_TEXT, "新")
browser.find_element(By.XPATH, "//*[@class='bg s_btn']")
browser.find_element(By.CSS_SELECTOR, "span.bg s_btn_wr>input#su")

总结
1、火狐浏览器安装firebug和firepath插件后,右键可以直接复制元素的Xpath;
2、需要多多练习css选择器的使用。

4.2 控制浏览器

1、控制浏览器大小:set_window_size()
2、浏览器前进、后退:forward()、back()
3、模拟浏览器刷新:refresh()

'''
Created on 2019年11月17日

@author: Yue
@attention: 本节东西不多,就是对于浏览器本身的一些控制
@note:
1、控制浏览器大小:set_window_size()
2、浏览器前进、后退:forward()、back()
3、模拟浏览器刷新:refresh()
'''
#coding=UTF-8
from selenium import webdriver
from time import sleep

browser = webdriver.Chrome()

# 4.2.1_设置浏览器大小(单位:px)
print("设置浏览器宽480,高800,显示。")
browser.set_window_size(480,800)
sleep(3)

# 4.2.2_后退、前进
#访问百度首页
first_url = "http://www.baidu.com"
print("now access %s." %(first_url))
browser.get(first_url)
sleep(2)
#访问新闻页面
second_url = "http://news.baidu.com"
print("now access %s" %(second_url))
browser.get(second_url)
sleep(2)
#后退到百度首页
print("back to %s" %(first_url))
browser.back()
sleep(2)
#前进到新闻页
print("forward to %s" %(second_url))
browser.forward()
sleep(2)

# 4.2.3_刷新页面
browser.get("https://blog.csdn.net/weixin_37846886/article/details/103094452")
sleep(2)
browser.refresh()


browser.quit()

4.3简单元素操作

1、清除文本:clear()
2、模拟按键输入文本:send_keys(“xxxx”)
3、单击:click()
4、提交表单:submit()
5、返回元素尺寸:size
6、获取元素文本:text
7、获得属性值:get_attribute(name)
8、设置显示和隐藏:is_displayed()

'''
Created on 2019年11月17日

@author: Wei_Yue
@attention:最常用的几个操作元素的方法
@note:
1、清除文本:clear()
2、模拟按键输入文本:send_keys("xxxx")
3、单击:click()
4、提交表单:submit()
5、返回元素尺寸:size
6、获取元素文本:text
7、获得属性值:get_attribute(name)
8、设置显示和隐藏:is_displayed()
'''
#coding=UTF-8
from selenium import webdriver

browser = webdriver.Chrome()

#4.3.1_百度搜索关键字
browser.get("http://www.baidu.com")
browser.find_element_by_id("kw").clear()
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()

#4.3.2_WebElement接口常用方法
#submit()——相当于回车,不用点击搜索按钮了。但不如click()用得广泛
browser.get("http://www.youdao.com")
browser.find_element_by_id("translateContent").send_keys("hello")
browser.find_element_by_id("translateContent").submit()#提交搜索内容
#size,获得输入框尺寸
browser.get("http://www.baidu.com")
size = browser.find_element_by_id("kw").size
print(size)
#text,返回百度底部备案信息
text = browser.find_element_by_id("cp").text
print(text)
# get_attribute(),返回输入框的id、name、type或其他任意属性
attribute = browser.find_element_by_id("kw").get_attribute("type")
print(attribute)
# is_displayed(),返回元素是否可见,True/False
result = browser.find_element_by_id("kw").is_displayed()
print(result)


browser.quit()

4.4鼠标事件

1、单击:click()
2、右击:context_click()
3、双击:double_click()
4、拖动:drag_and_drop()
5、鼠标悬停:move_to_element()
6、执行动作:perform()

'''
Created on 2019年11月18日

@author: Yue
@attention:鼠标事件
@note:
1、单击:click()
2、右击:context_click()
3、双击:double_click()
4、拖动:drag_and_drop()
5、鼠标悬停:move_to_element()
6、执行动作:perform()
'''
#coding=UTF-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

browser = webdriver.Chrome()
browser.get("http://www.baidu.com")

#4.4.1_右击context_click()
inputBlock = browser.find_element_by_id("kw")#定位百度输入框
ActionChains(browser).context_click(inputBlock).perform()#进行右击(动作最后加perform方式是执行)

#4.4.2_双击context_click()
ActionChains(browser).double_click(inputBlock).perform()

#4.4.3_拖动drag_and_drop()
target = browser.find_element_by_id("xx")#定位设置要拖放到的目标位置
ActionChains(browser).drag_and_drop(inputBlock, target).perform()

#4.4.4_鼠标悬停move_to_element()
element = browser.find_elements_by_css_selector("a.pf")#定位百度首页“设置”
ActionChains(browser).move_to_element(element).perform()

疑问
悬停后,弹出的菜单项如何定位??

4.5键盘事件

**send_keys()**除了可以输入字符,还可以模拟其他功能键和组合键(eg.Ctrl+C)

1、删除键Backspace:send_keys(Keys.BACK_SPACE)
2、空格键Space:send_keys(Keys.SPACE)
3、制表键Tab:send_keys(Keys.TAB)
4、回退键Esc:send_keys(Keys.ESCAPE)
5、回车键Enter:send_keys(Keys.ENTER)
6、全选Ctrl+A:send_keys(Keys.CONTROL,“a”)
7、复制Ctrl+C:send_keys(Keys.CONTROL,“c”)
8、剪切Ctrl+X:send_keys(Keys.CONTROL,“x”)
9、粘贴Ctrl+V:send_keys(Keys.CONTROL,“v”)
10、键盘F1:send_keys(Keys.F1)
11、键盘F12:send_keys(Keys.F12)

'''
Created on 2019年11月19日

@author: Yue
@attention:send_keys()除了可以输入字符,还可以模拟其他功能键和组合键(eg.Ctrl+C)
@note:
1、删除键Backspace:send_keys(Keys.BACK_SPACE)
2、空格键Space:send_keys(Keys.SPACE)
3、制表键Tab:send_keys(Keys.TAB)
4、回退键Esc:send_keys(Keys.ESCAPE)
5、回车键Enter:send_keys(Keys.ENTER)
6、全选Ctrl+A:send_keys(Keys.CONTROL,"a")
7、复制Ctrl+C:send_keys(Keys.CONTROL,"c")
8、剪切Ctrl+X:send_keys(Keys.CONTROL,"x")
9、粘贴Ctrl+V:send_keys(Keys.CONTROL,"v")
10、键盘F1:send_keys(Keys.F1)
11、键盘F12:send_keys(Keys.F12)
'''
#coding=UTF-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
searchStr = browser.find_element_by_id("kw")
searchStr.send_keys("seleniumm")

#删除多输入的m
searchStr.send_keys(Keys.BACK_SPACE)

# 输入空格+“教程”
searchStr.send_keys(Keys.SPACE)
searchStr.send_keys("教程")

# 全选输入框内容
searchStr.send_keys(Keys.CONTROL,"a")

# 剪切输入框内容
searchStr.send_keys(Keys.CONTROL,"x")

# 粘贴内容到输入框
searchStr.send_keys(Keys.CONTROL,"v")

# 回车代替单击进行搜索
searchStr.send_keys(Keys.ENTER)


browser.quit()

总结:
最近编译总出现这种报错信息——“syntaxerror:non-utf-8 code starting with \xc4’in file”。想想配置的eclipse编码格式是utf-8,源码开头是文档注释,紧接着就是编码声明和代码,以前明明也正常运行啊,后来几天就老是有问题,莫名其妙。

查询网络才知道是因为:eclipse中使用python时默认的编码为ASCII格式。因此必须在开头声明保存编码的格式是什么,如果不进行编码声明则代码中有中文就会出错(即使你的中文是包含在注释里面的)。

还有只要运行成功一次,及时删掉声明,以后也能成功运行,真是个神奇的存在。(我之前的文档注释都是运行过程序,后加的。)
详见https://jingyan.baidu.com/article/4f34706e3f0a74e387b56dbc.html

4.6获得验证信息

1、获取页面title:title
2、获取页面URL:current_url
3、获取页面某标签元素文字:text

'''
Created on 2019年11月20日

@author: Wei_Yue
@attention:登录前后分别获取页面title、url、用户名text可以判断登录成败
@note:
1、获取页面title:title
2、获取页面URL:current_url
3、获取页面某标签元素文字:text
'''
#coding=UTF-8
from selenium import webdriver

browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
#不演示登录过程,只演示下几个方法的使用
print(browser.title)
print(browser.current_url)
print(browser.find_element_by_xpath(".//*[@id='u1']/a[6]").text)


browser.quit()

4.7设置元素等待

'''
Created on 2019年11月21日

@author: Yue
@attention:大多数web应用使用ajax技术,可能有延迟。为了解决这种问题,增加元素等待
@note:
1、显式等待:
WebDriverWait(drivername, timeout-超时时间, poll_frequency-检测步长默认0.5s, ignored_exceptions-超时后的异常信息默认是NoSuchElementException).
上述方法一般和until(method, message='')配合使用
如实例代码中,EC.presence_of_element_located((By.ID, "kw")))用于判断元素是否存在,直到返回True

expected_conditions类提供的预期条件的判断方法
title_is():页面标题是否等于预期
title_contains():页面标题是否包含预期字符串
presence_of_element_located():元素是否在DOM树,不一定可见
visibility_of_element_located():元素是否可见(非隐藏,宽高均不为0)
visibility_of():同上,上个方法参数定位,本方法参数为定位后的元素
presence_of_all_elements_located():是否至少有一个元素在DOM树种
text_to_be_present_in_element():元素text中是否包含了预期字符串
text_to_be_present_in_element_value():元素value属性是否包含了预期字符串
frame_to_be_available_and_switch_to_it():表单是否可以切换进去,如果可以,返回True并switch进去,否则返回false
invisibility_of_element_located():判断元素是否不存在于DOM树或不可见
element_to_be_clickable():元素是否可见且可点击
staleness_of():等到元素从DOM中移除
element_to_be_selected():元素是否被选中,一般用在下拉列表
element_selection_state_to_be():元素的选中状态是否符合预期
element_located_selection_state_to_be():同上,上述方法参数为定位后的元素,本方法的参数为定位
alert_is_present():页面是否存在alert

除expected_conditions的预期条件判断方法,还可以使用is_displayed()判断元素是否可见


2、隐式等待:implicitly_wait(),默认为0
直接设置最大等待时长,不针对页面某特定元素定位。轮询方式判断元素是否定位成功,设置时间内成功,继续执行下一步;超出设置时间没有定位到元素则抛出异常。

3、sleep休眠方法:sleep(),python的time类方法,单位为s,可以是小数。固定休眠时间,等待设置描述后再进行下一步操作

'''
#coding=UTF-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC #重命名引入的类为EC
from selenium.webdriver.common.by import By
from time import ctime
from asyncio.tasks import sleep

browser = webdriver.Chrome()

#4.7.2_设置隐式等待
browser.implicitly_wait(10)

browser.get("http://www.baidu.com")

#4.7.1_设置显示等待
# expected_conditions预期条件判断
element = WebDriverWait(browser, 5, 0.5, ignored_exceptions=None).until(EC.presence_of_element_located((By.ID, "kw")))                                          
element.send_keys("selenium")
#is_displayed()判断是否可见
print(ctime)
for i in range(10):
    try:
        el = browser.find_element_by_id("kw22")
        if el.is_displayed():
            break
    except:pass
    #4.7.3_等待1s后再进行下一次循环
    sleep(1)
else:   #只有for循环没有break终止而是完全循环结束,才会执行else后语句
    print("time out")
browser.close()
print(ctime())


browser.quit()

4.8定位一组元素

和4.1的定位方法一样,只是element改为elements

1、find_elements_by_id(“id_”)
2、find_elements_by_name(“name”)
3、find_elements_by_class_name(“name”)
4、find_elements_by_tag_name(“name”)
5、find_elements_by_link_text(“text”)
6、find_elements_by_partial_link_text(“link_text”)
7、find_elements_by_xpath(xpath)

len():计算元素个数

pop():
pop()/pop(-1):获取元素列表中的最后一个
pop(0):获取元素列表中的第一个

'''
Created on 2019年11月23日

@author: Yue
@attention:和4.1的定位方法一样,只是element改为elements
@note:
1、find_elements_by_id("id_")
2、find_elements_by_name("name")
3、find_elements_by_class_name("name")
4、find_elements_by_tag_name("name")
5、find_elements_by_link_text("text")
6、find_elements_by_partial_link_text("link_text")
7、find_elements_by_xpath(xpath)
8、find_elements_by_css_selector(css_selector)

len():计算元素个数

pop():
pop()/pop(-1):获取元素列表中的最后一个
pop(0):获取元素列表中的第一个


'''
#coding=UTF-8
from selenium import webdriver
from time import sleep

browser = webdriver.Chrome()
browser.get("url")

#勾选一组复选框checkbox
checkboxs = browser.find_elements_by_xpath("//input[@type='checkbox']") #xpath定位所有checkbox
checkboxs = browser.find_elements_by_css_selector("input[type=checkbox]")   #css选择器定位所有CheckBox

for box in checkboxs:
    box.click()
    sleep(1)
    
#打印当前页面上CheckBox的个数
print(len(checkboxs))   

#取消选中最后一个CheckBox
browser.find_elements_by_css_selector("input[type=checkbox]").pop().click()


browser.quit()

4.9多表单切换

页面嵌入了frame/iframe表单,无法直接定位frame内元素,需要先使用方法切换进入表单

1、switch_to_.frame(“id/name/xpath_object”):切换进入表单,参数可以是frame元素id或name或者使用xpath等定位方法定位后的元素对象
2、switch_to.parent_content():跳出当前frame,返回上一层页面
3、switch_to.default_content():跳回最外层页面

'''
Created on 2019年11月24日

@author: Yue
@attention:页面嵌入了frame/iframe表单,无法直接定位frame内元素,需要先使用方法切换进入表单
@note:
1、switch_to_.frame("id/name/xpath_object"):切换进入表单,参数可以是frame元素id或name或者使用xpath等定位方法定位后的元素对象
2、switch_to.parent_content():跳出当前frame,返回上一层页面
3、switch_to.default_content():跳回最外层页面

'''
#coding=UTF-8
from selenium import webdriver

browser = webdriver.Chrome()
browser.get("url")

#4.9.1_1.假设表单id为iframe,name为nframe,切换到表单
browser.switch_to("iframe")
#4.9.1_2.xpath定位frame后切换进入frame
xframe = browser.find_element_by_xpath("//*[@id='iframe']")
browser.switch_to(xframe)
#接下来可以正常定位元素
browser.find_element_by_id("id_")

#4.9.2_返回上一层页面
browser.switch_to.parent_frame()
#返回最外层页面
browser.switch_to.default_content()


browser.quit()

4.10多窗口切换

1、switch_to.window():切换窗口,参数为窗口句柄
2、current_window_handle:获取当前窗口的句柄
3、window_handles:返回所有窗口的句柄

'''
Created on 2019年11月25日

@author: Yue
@attention:浏览器打开多个窗口后切换窗口
@note:
1、switch_to.window():切换窗口,参数为窗口句柄
2、current_window_handle:获取当前窗口的句柄
3、window_handles:返回所有窗口的句柄

'''
#coding=UTF-8
from selenium import webdriver
from time import sleep

browser = webdriver.Chrome()
browser.implicitly_wait(3) #隐式等待3s
browser.get("http://www.baidu.com")

#获得当前窗口的句柄
init_windows = browser.current_window_handle

browser.find_element_by_link_text('登录').click()
browser.find_element_by_link_text('立即注册').click()

#获得所有打开窗口的句柄
all_handles = browser.window_handles

#进入注册窗口
for handle in all_handles:
    if handle != init_windows:
        browser.switch_to.window(handle)
        print("现在是注册窗口。")
        browser.find_element_by_name('account').send_keys("username")
        browser.find_element_by_name("password").send_keys("password")
        sleep()
        
#回到搜索窗口
for handle in all_handles:
    if handle == init_windows:
        browser.switch_to(handle)
        print("现在回到了百度首页。")
        browser.find_element_by_id("TANGRAM__PSP_2__closeBtn").click()
        browser.find_element_by_id("kw").send_keys("selenium")
        browser.find_element_by_id("su").click()


browser.quit()

4.11警告框处理

处理javascript生成的alert、confirm、prompt

1、switch_to_alert():定位弹窗。
(以下为上述方法的后续操作)
—2、text:返回弹窗文字
—3、accept():接受警告窗
—4、dismiss():解散警告窗
—5、send_keys(“keysToSend”):发送文本到警告窗

'''
Created on 2019年11月26日

@author: Yue
@attention:处理javascript生成的alert、confirm、prompt
@note:
1、switch_to_alert():定位弹窗。
(以下为上述方法的后续操作)
     2、text:返回弹窗文字
    3、accept():接受警告窗
    4、dismiss():解散警告窗
    5、send_keys("keysToSend"):发送文本到警告窗
    
'''
#coding=UTF-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep

browser = webdriver.Chrome()
browser.implicitly_wait(3)
browser.get("http://www.baidu.com")

#鼠标悬停至“设置”链接
link = browser.find_element_by_link_text("设置")
ActionChains(browser).move_to_element(link).perform()
sleep(2)
#打开搜索设置
browser.find_element_by_link_text("搜索设置").click()
sleep(2)
#保存设置
browser.find_element_by_class_name("prefpanelgo").click()
sleep(2)
#接受警告窗
browser.switch_to_alert().accept()


browser.quit()

4.12上传文件

web页面上传文件:普通上传、插件上传(flash、js、ajax等)

1、普通上传:将本地文件路径放到input标签中,通过form表单提交给服务器
2、插件上传:这里是调用AutoIt进行上传(有点看不下去这部分,暂时略过)

'''
Created on 2019年11月27日

@author: Yue
@attention:web页面上传文件:普通上传、插件上传(flash、js、ajax等)
@note:
1、普通上传:将本地文件路径放到input标签中,通过form表单提交给服务器
2、插件上传:使用flash、js、ajax等控件上传

'''
#coding=UTF-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.implicitly_wait(3)  #隐式等待
browser.get("http://www.baidu.com")
#显示等待:上一步操作后,等待某元素定位成功后再进行下一步
element = WebDriverWait(browser, 3, 0.5).until(expected_conditions.presence_of_element_located(By.ID,"kw"))

#4.12.1_send_keys()上传:type为file的input标签用以下方法——定位上传按钮,添加本地文件
browser.find_element_by_name("file").send_keys("文件的完整本地路径")


browser.quit()

4.13下载文件

以Firefox为例,设置默认下载路径,自动下载到设置的目录。
两种方式:浏览器下载、通用的方法为AutoIt(与上传同理,本次不写)

1、fp.set_preference(“key”, “value”):配置文件项和对应的值,详见代码区
2、webdriver.Firefox(firefox_profile=fp):创建一个火狐浏览器驱动对象,使用名称为fp的配置文件进行浏览器的设置

'''
Created on 2019年11月29日

@author: Yue
@attention:以Firefox为例,设置默认下载路径,自动下载到设置的目录。两种方式:浏览器下载、通用的方法为AutoIt(与上传同理,本次不写)
@note:
1、fp.set_preference("key", "value"):配置文件项和对应的值,详见代码区
2、webdriver.Firefox(firefox_profile=fp):创建一个火狐浏览器驱动对象,使用名称为fp的配置文件进行浏览器的设置

'''
#coding=UTF-8
from selenium import webdriver
import os

#创建Firefox配置文件
fp = webdriver.FirefoxProfile()

#下载设置
fp.set_preference("browser.download.folderList", 2)  #设置下载路径,0-浏览器默认下载路径,2-保存到指定路径
fp.set_preference("browser.download.manager.showWhenStarting", False)   #是否显示开始,True-显示,False-不显示
fp.set_preference("browser.download.dir",os.getcwd())   #指定下载文件的目录,os.getcwd()-返回当前目录(也就是脚本文件目录)
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream")   #下载文件的类型,HTTP常用Content-type对照表:http://tool.oschina.net/commons

#下载selenium-2到脚本目录下
browser = webdriver.Firefox(firefox_profile=fp)
browser.get("http://pypi.Python.org/pypi/selenium")
browser.find_element_by_partial_link_text("selenium-2").click()


browser.quit()

4.14操作Cookie

'''
Created on 2019年12月1日

@author: Yue
@attention:读取、添加和删除cookie的方法
@note:
1、get_cookies():获得所有cookie信息
2、get_cookie(name):返回字典的key为name的cookie信息
3、add_cookie(cookie_dict):添加cookie。参数为字典对象,必须有name和value值
4、delete_cookie(name,optionsString):删除名为name的cookie
name——要删除的cookie的名称
optionString——该cookie的选项:路径或域

5、delete_all_cookies():删除浏览器所有cookie


'''
#coding=UTF-8
from selenium import webdriver

browser = webdriver.Chrome()
browser.implicitly_wait(3)  #隐式等待
browser.get("http://www.youdao.com")

#获得cookie信息
cookies = browser.get_cookies()
print(cookies)

#向cookie的name和value中添加会话信息
browser.add_cookie({
     'name':'key-addcookiename', 'value':'value-addcookievalue'})

#遍历cookies中的name和value信息并打印(cookies已经包含上述添加的信息)
for cookie in browser.get_cookies():
    print("%s -> %s" %(cookie['name'], cookie['value']))


browser.quit()

4.15调用JavaScript

execute_script()方法用于执行js代码:

'''
Created on 2019年12月1日

@author: Yue
@attention:execute_script()方法用于执行js代码
@note:
1、execute_script():执行js代码

'''
#coding=UTF-8
from selenium import webdriver
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from time import sleep

browser = webdriver.Chrome()
browser.implicitly_wait(3)  #隐式等待
browser.get("http://www.baidu.com")
#显示等待:上一步操作后,等待某元素定位成功后再进行下一步
element = WebDriverWait(browser, 3, 0.5).until(expected_conditions.presence_of_element_located((By.ID,"kw")))

#设置浏览器窗口大小
browser.set_window_size(600, 600)
#搜索
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
sleep(2)
#通过JavaScript设置浏览器窗口的滚动条位置
js = "window.scrollTo(100,450);"
browser.execute_script(js)
sleep(3)


'''
对于多行文本框textarea,无法使用send_keys()输入内容,需使用js
eg.



python
text = "This is input text"
js = "var area=document.getElementById('id') area.value='"; + text + "';"
browser.execute_script(js)

'''

browser.quit()

4.16处理H5视频播放

'''
Created on 2019年12月4日

@author: Yue
@attention:HTML5的视频播放(执行js脚本)
@note:
1、

'''
#coding=UTF-8
from selenium import webdriver
from time import sleep

browser = webdriver.Chrome()
browser.implicitly_wait(3)  #隐式等待
browser.get("http://vidoejs.com")

video = browser.find_element_by_xpath("body/Setion[1]/div/video")

#返回播放文件地址
'''
#arguments是js函数内置的对象,包含了函数调用的参数数组,[0]表示对象的第一个值
currentSrc返回当前音频/视频的url,如未设置,返回空
'''
url = browser.execute_script("return arguments[0].currentSrc;", video)  
print(url) 

#播放视频
print("start")
browser.execute_script("return arguments[0].play()", video)

#播放15s
sleep(15)

#暂停视频
print("stop")
browser.execute_script("arguments[0].pause()', video")

'''
load()、play()、pause()控制视频的加载、播放和暂停
'''


browser.quit()

4.17窗口截图


from selenium import webdriver
from time import sleep

browser = webdriver.Chrome()
browser.get("http://www.baidu.com")

browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
sleep(2)

browser.get_screenshot_as_file("C:\\Users\\Wei_Yue\\Desktop\\baidu_selenium.png")


browser.quit()

4.18关闭窗口

'''
Created on 2019年12月6日

@author: Yue
'''
#coding=UTF-8
from selenium import webdriver
from time import sleep

browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
sleep(3)

browser.close() #关闭当前窗口(程序不结束)

browser.quit() #关闭所有窗口,退出驱动程序

4.19处理验证码

'''
Created on 2019年12月8日

@author: Yue
@attention:
@note:
1、去掉验证码
2、后台设置万能验证码
3、Python-tesseract识别
4、记录cookie

'''
#coding-UTF-8
from selenium import webdriver

browser = webdriver.Chrome()
#访问网站
browser.get("http://www.xx.com")

#将用户名密码写入浏览器cookie(cookie的key可以用get_cookies()获取)
browser.add_cookie({
     "name":"username", "value":"xiaoming"})
browser.add_cookie({
     "name":"", "value":"123456"})

#再次访问网站,即可自动登录
browser.get("http://www.xx.com")

browser.quit()

4.20webdriver原理(待更新……)

你可能感兴趣的:(测试,自动化,selenium,python,webdriver)