Selenium系列知识点整理--个人总结

发布时间 2023-12-14 17:54:19作者: 痴颠笑天

Selenium系列知识点整理

-----https://www.cnblogs.com/yoyoketang/

-----本文摘录于‘上海-悠悠’的博客,网址如上

 

 

新手学习selenium路线图(老司机亲手绘制)-学前篇

 

 

学习selenium主要分六个阶段,自己在哪个层级,可以对号入座下。
第 一阶段:幼儿园
1.选语言:在学习自动化前,先要选一门语言学习,而不是选什么工具,学习selenium,目前最流行的是java和python,至于选哪个,看自己 的爱好了,这里就不说哪个语言好(php才是最好的语言)。小编是半路出家,没什么语言基础,所以选的python作为自动化入门的脚本语言。
2.python:选好语言之后,接下来就是学习基础的语法了,目前市面上python脚本分为2个:python2和python3,区别到不是很大,新手的话建议python2吧,有一定解决问题能力的小伙伴可以直接入手python3
3.python基础:选好python版本后,接下来就是python的基础学习了,python的基础教程目前网上有非常成熟的学习教程了,适合新手 的教程小编推荐2个:第一个是廖雪峰的,这个可以说是国内比较成熟的,并且适合小白入门的课程了http://www.liaoxuefeng.com /;另外一个网站是python菜鸟教程http://www.runoob.com/python/python-tutorial.html。基础的东西主要包括:print、变量、数据类型、for、if、while这些,这些基本的了解了,差不多就可以上手了。
4.selenium:接下来就是学习selenium了,selenium目前有三个版:selenium1也就是selenium RC这个已经很古老了,不用浪费时间去研究了;然后是selenium2,这个是目前最流行的了;最近出的selenium3,其实selenium2区 别不大,主要是启动firefox会遇到两个坑,刚入手的小白估计踩到坑里就爬不起来了。试下一下,好不容易环境搭建好了,结果启动firefox报错, 简直就是当面一盆子冷水泼过来。好不容易解决完前面的一个坑,然后又有第二坑。所以小白入手selenium推荐selenium2
第二阶段:小学
5.selenium API:很多小伙伴学习自动化喜欢先用录制的工具,学自动化录制是 最不靠谱的,举个简单例子:如果一个元素的id是动态的,你这次录制好了,回放时候,元素id已经变了,这时候不管你怎么回放都是不成功的。所以录制这 玩意,了解下原理就可以了,不用花时间去研究。学习selenium,我们直接去看api文档就行。
6.元素定位:selenium提供了八种元素定位:id、name、class、tag、link、patail_link、xpath、css.对 于元素定位不太懂的这个时候需要用到firepath和firebug来辅助定位,这时候就需要补充下html的知识了,对html越熟悉,你定位元素越 快。先是通过简单的元素属性定位,后来你发现有些元素的属性没有,或者很多重复,被我们的开发同学不规范的代码坑的不要不要的,这时候就得学xpath了
7.xpath:xpath定位基本上可以解决80%的元素定位问题,但也不是万能的,很多小伙伴刚接触时候,简直就是当成宝。xpath可以看成定位 界的宝刀屠龙,虽然威力大,但是比较笨重,定位元素慢,语法很长,还不稳定,也是被坑的不要不要的,这时候有必要去学习下css了
第三阶段:中学
8.css:css定位速度快,稳准狠,定位界的倚天剑,轻巧,语法简洁。但也不是万能的,有些模糊匹配的地方,还是得靠xpath大哥来搞定
9.操作元素:定位好元素之后接下来就是操作元素了,主要有困难的是鼠标事件和键盘事件
10.判断元素:操作完后,就是获取返回结果了,或者是判断元素是不是期望结果
11.unittest:前面都是简单的操作,无法生产测试用例,是时候找个测试框架帮我们运行用例了,于是就依靠unittest
12.测试报告:用例执行完之后,总得有个测报告吧,这时候需要用到html的测试报告
第四阶段:高中
14.函数:前面简单的用例搭建好之后,写用例时候,发现每次重复操作更记流水账一样,这个时候就要学习函数了,把
15.类和方法:当函数写多了后,发现不少很方便,能不能把常用的操作写到一块,需要哪个直接调用呢,这时候就得学习类和方法了
16.参数化:用例优化的差不多时候,发现测试数据想改下,找起来好麻烦,于是想到把测试数据分离出来,用到参数化
17.数据驱动:参数化后,紧接着就是数据驱动啦,用例写好后,仅需维护测试数据就可以了
第五阶段:大学
18.封装:常用的方法已经非常熟练了,这时候需要封装了
19.jenkins:当用例写的差不多后,最后肯定是希望能一键执行,这时候,需要用到jenkins来做持续集成
20.代码仓库:多人一起做自动化项目时候,这时候需要代码同步,于是会遇到svn、git工具
第六阶段:研究生
21.js:前面selenium东西学完之后,发现很多场景是selenium无法完成的,比如浏览器的滚动条,这时候需要学js啦。。。
22.学无止境:接下来要看个人的研究方向了,学无止境。。。
那么问题来了:这么多东西,如何下手呢?

 

首先给自己定个小目标,先关注个微信公众号:yoyoketang
然后关注个一个神奇的博客:http://www.cnblogs.com/yoyoketang/

 

 

 

Selenium2+python自动化1-环境搭建

https://www.cnblogs.com/yoyoketang/p/selenium.html

 

Selenium2+python自动化2-pip降级selenium3.0

https://www.cnblogs.com/yoyoketang/p/6111585.html

pip查看selenium版本号

>>pip show selenium

 

pip选择安装selenium版本

    1.为了避免与之前安装的selenium版本冲突,先找到selenium3.0目录:python\Lib\site-packages目录

把里面selenium开头的文件全部删除就可以了。python所有的第三方包都在这个目录下面。

     2.打开cmd,输入pip install selenium==2.53.6(注意是两个==,中间不要留空格,这里推荐2.53.6的版本)

 

升级pip版本

>>python -m pip install --upgrade pip

 

Selenium2+python自动化3-解决pip使用异常

https://www.cnblogs.com/yoyoketang/p/6111644.html

 

Selenium2+python自动化4-Pycharm使用

https://www.cnblogs.com/yoyoketang/p/6115825.html

 

Selenium2+python自动化5-操作浏览器基本方法

 

对浏览器做一些常规的操作,如打开、前进、后退、刷新、设置窗口大小、截屏、退出等操作。
一、打开网站
1.第一步:从selenium里面导入webdriver模块
2.打开Firefox浏览器(Ie和Chrome对应下面的)
3.打开百度网址
>>driver.get('https://www.abidu.com')

二、设置休眠
1.由于打开百度网址后,页面加载需要几秒钟,所以最好等到页面加载完成后再继续下一步操作
2.导入time模块,time模块是Python自带的,所以无需下载
3.设置等待时间,单位是秒(s),时间值可以是小数也可以是整数
>>time.sleep( 3 ) #以秒为单位

三、页面刷新
1.有时候页面操作后,数据可能没及时同步,需要重新刷新
2.这里可以模拟刷新页面操作,相当于浏览器输入框后面的刷新按钮
>>driver.refresh()

四、前进和后退
1.当在一个浏览器打开两个页面后,想返回上一页面,相当于浏览器左上角的左箭头按钮
2.返回到上一页面后,也可以切换到下一页,相当于浏览器左上角的右箭头按钮
>>driver.back() #后退
>>driver.forward() #前进

五、设置窗口大小
1.可以设置浏览器窗口大小,如设置窗口大小为手机分辨率540*960
2.也可以最大化窗口
>>driver.set_window_size(540,960) #设置窗口大小为540*960
>>driver.maximize_window() #将浏览器窗口最大化

六、截屏
1.打开网站之后,也可以对屏幕截屏
2.截屏后设置制定的保存路径+文件名称+后缀
>>driver.get_screenshot_as_file("D:\\test\\bbb.jpg")

七、退出
1.退出有两种方式,一种是close;另外一种是quit
2.close用于关闭当前窗口,当打开的窗口较多时,就可以用close关闭部分窗口
3.quit用于结束进程,关闭所有的窗口
4.最后结束测试,要用quit。quit可以回收c盘的临时文件
>>driver.close() #关闭当前窗口
>>driver.quit() #退出浏览器

 

 

 

Selenium2+python自动化6-八种元素元素定位(Firebugfirepath

 

 

selenium的webdriver提供了八种基本的元素定位方法,前面六种是通过元素的属性来直接定位的,后面的xpath和css定位更加灵活,需要重点掌握其中一个。
说明:如果运行后会报错,说明这个搜索框的属性(id,name,。。。)不是唯一的,无法通过属性直接定位到输入框
1.通过id定位:find_element_by_id()
2.通过name定位:find_element_by_name()
3.通过class定位:find_element_by_class_name()
4.通过tag(标签)定位:find_element_by_tag_name()
5.通过link(超链接)定位:find_element_by_link_text()
6.通过partial_link定位:find_element_by_partial_link_text()
7.通过xpath定位:find_element_by_xpath()
8.通过css定位:find_element_by_css_selector()

 

 

Selenium2+python自动化7-xpath定位

https://www.cnblogs.com/yoyoketang/p/6123938.html

 

Selenium2+python自动化8-SeleniumBuilder辅助定位元素

https://www.cnblogs.com/yoyoketang/p/6128548.html

 

Selenium2+python自动化9-CSS定位语法

https://www.cnblogs.com/yoyoketang/p/6128580.html

 

Selenium2+python自动化10-登录案例

 

https://www.cnblogs.com/yoyoketang/p/6128596.html

 

写一个简单的登录测试脚本
# coding:utf-8
from selenium import webdriver
import time

def login(driver, user, password):
'''登录github'''
# 打开github首页
driver.get("https://github.com/login")
driver.implicitly_wait(10)
# 输入账号
driver.find_element_by_id("login_field").send_keys(user)
# 输入密码
driver.find_element_by_id("password").send_keys(password)
driver.find_element_by_name("commit").click()

def logout(driver):
'''退出github'''
time.sleep(3)
# 点右上角设置
driver.find_element_by_css_selector(".HeaderNavlink.name.mt-1").click()
time.sleep(1)
# 点sign out
driver.find_element_by_css_selector(".dropdown-item.dropdown-signout").click()
driver.quit()

if __name__ == "__main__":
driver = webdriver.Firefox()
# 调用登录
login(driver, "youruser", "yourpsw")
print("hello yoyo!")
# 调用退出
logout(driver)

 

Selenium2+python自动化11-定位一组元素find_elements

 

有时候一个页面上有多个对象需要操作,如果一个个去定位的话,比较繁琐,这时候就可以定位一组对象。
webdriver 提供了定位一组元素的方法,跟前面八种定位方式其实一样,只是前面是单数,这里是复数形式:find_elements

 

# 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_elements_by_css_selector("h3.t>a")
# 设置随机值
t = random.randint(0, 9)
# 随机取一个结果点击鼠标
a = s[t].get_attribute("href")
print a
driver.get(a)

 

Selenium2+python自动化12-操作元素(键盘和鼠标事件)

 

本篇总结了web页面常用的一些操作元素方法,可以统称为行为事件
有些web界面的选项菜单需要鼠标悬停在某个元素上才能显示出来(如百度页面的设置按钮)。
一、简单操作
1.点击(鼠标左键)页面按钮:click()
2.清空输入框:clear()
3.输入字符串:send_keys()

二、submit提交表单
1.submit()一般用于模拟回车键
>>driver.find_element_by_id("kw").submit()

 

三、键盘操作
1.selenium提供了一整套的模拟键盘操作事件,前面submit()方法如果不行的话,可以试试模拟键盘事件
2.模拟键盘的操作需要先导入键盘模块:from selenium.webdriver.common.keys import Keys
3.模拟enter键,可以用send_keys(Keys.ENTER)
4.其它常见的键盘操作:
键盘F1到F12:send_keys(Keys.F1) 把F1改成对应的快捷键
复制Ctrl+C:send_keys(Keys.CONTROL,'c')
粘贴Ctrl+V:send_keys(Keys.CONTROL,'v')
全选Ctrl+A:send_keys(Keys.CONTROL,'a')
剪切Ctrl+X:send_keys(Keys.CONTROL,'x')
制表键Tab: send_keys(Keys.TAB)

 

四、鼠标悬停事件
1.鼠标不仅仅可以点击(click),鼠标还有其它的操作,如:鼠标悬停在某个元素上,鼠标右击,鼠标按住某个按钮拖到
2.鼠标事件需要先导入模块:from selenium.webdriver.common.action_chains import ActionChains
perform() 执行所有ActionChains中的行为

move_to_element() 鼠标悬停

3.这里以百度页面设置按钮为例

 

#coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
# 鼠标悬停在搜索设置按钮上
mouse = driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(mouse).perform()

 

4.除了常用的鼠标悬停事件外,还有
右击鼠标:context_click()
双击鼠标:double_click()

 

Selenium2+python自动化13-多窗口、句柄(handle

 

二、获取当前窗口句柄
1.获取当前页面的句柄:h = driver.current_window_handle

三、获取所有句柄
1.获取当前所有的句柄:all_h = driver.window_handles

四、切换句柄
方法一:
1.循环判断是否与首页句柄相等
2.如果不等,说明是新页面的句柄
3.获取的新页面句柄后,可以切换到新打开的页面上
4.打印新页面的title,看是否切换成功
方法二:
1.直接获取all_h这个list数据里面第二个hand的值:all_h[1]

# 方法一:判断句柄,不等于首页就切换
for i in all_h:
if i != h:
driver.switch_to.window(i)
print driver.title
# 方法二:获取list里面第二个直接切换
driver.switch_to.window(all_h[1])
print driver.title

五、关闭新窗口,切回主页
1.打开新页面后,其实只想验证新页面跳转对不对,这里可以做个简单的验证,获取当前页面的title验证
2.验证完后切关闭新窗口
3.切回句柄到首页
4.打印当前页面的句柄,看是否切换到首页了

# 方法二:获取list里面第二个直接切换
driver.switch_to.window(all_h[1])
print driver.title
#关闭新窗口
driver.close()
#切换到首页句柄
driver.switch_to.window(h)
#打印当前的title
print driver.title

六、参考代码

# coding:utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://bj.ganji.com/")
h = driver.current_window_handle
print h # 打印首页句柄
driver.find_element_by_link_text("招聘求职").click()
all_h = driver.window_handles
print all_h # 打印所有的句柄
# 方法一:判断句柄,不等于首页就切换
# for i in all_h:
# if i != h:
# driver.switch_to.window(i)
# print driver.title
# 方法二:获取list里面第二个直接切换
driver.switch_to.window(all_h[1])
print driver.title
# 关闭新窗口
driver.close()
# 切换到首页句柄
driver.switch_to.window(h)
# 打印当前的title
print driver.title

 

Selenium2+python自动化14-iframe

 

 

以http://mail.163.com/登录页面10为案例,详细介绍switch_to_frame使用方法.
一、frame和iframe区别

Frame与Iframe两者可以实现的功能基本相同,不过Iframe比Frame具有更多的灵活性。 frame是整个页面的框架,iframe是内嵌的网页元素,也可以说是内嵌的框架

Iframe标记又叫浮动帧标记,可以用它将一个HTML文档嵌入在一个HTML中显示。它和Frame标记的最大区别是在网页中嵌入 的<Iframe></Iframe>所包
含的内容与整个页面是一个整体,而<Frame>< /Frame>所包含的内容是一个独立的个体,是可以独立显示的。另外,应用Iframe还可以在同一个页面中
多次显示同一内容,而不必重复这段内 容的代码。

三、切换iframe
1.由于登录按钮是在iframe上,所以第一步需要把定位器切换到iframe上
2.用switch_to.frame方法切换,此处有id属性,可以直接用id定位切换
>>driver.switch_to.frame('此处填写对应的id值即可') #driver.switch_to_frame('与前面代码同样效果')

四、如果iframe没有id怎么办?
1.这里iframe的切换是默认支持id和name的方法的,当然实际情况中会遇到
没有id属性和name属性为空的情况,这时候就需要先定位iframe
2.定位元素还是之前的八种方法同样适用,这里我可以通过tag先定位到,也能达到同样效果
>>iframe = driver.find_element_by_tag_name("iframe")
>>driver.switch_to.frame( iframe )

五、释放iframe
1.当iframe上的操作完后,想重新回到 主页面 操作元素,这时候,
>>driver.switch_to.default_content() # >>driver.switch_to_default_content() #'与前面代码同样效果'

  

Selenium2+python自动化15-select下拉框

 

二、二次定位
1.定位select里的选项有多种方式,这里先介绍一种简单的方法:二次定位
2.基本思路,先定位select框,再定位select里的选项
3.代码如下
# 分两步:先定位下拉框,再点击选项
s = driver.find_element_by_id("nr")
s.find_element_by_xpath("//option[@value='50']").click()

4.还有另外一种写法也是可以的,把最下面两步合并成为一步:
driver.find_element_by_id("nr").find_element_by_xpath("//option[@value='50']").click()

 

三、直接定位
1.写xpath定位或者css,一次性直接定位到option上的内容。(不会自己手写的,回头看前面的元素定位内容)

四、Select模块(index)
1.除了上面介绍的两种简单的方法定位到select选项,selenium还提供了更高级的玩法,导入Select模块。直接根据属性或索引定位。
2.先要导入select方法:
from selenium.webdriver.support.select import Select
3.然后通过select选项的索引来定位选择对应选项(从0开始计数),如选择第三个选项:select_by_index(2)

五、Select模块(value)
1.Select模块里面除了index的方法,还有一个方法,通过选项的value值来定位。每个选项,都有对应的value值,如
<select id="nr" name="NR">
<option selected="" value="10">每页显示10条</option>
<option value="20">每页显示20条</option>
<option value="50">每页显示50条</option>
2.第二个选项对应的value值就是"20":select_by_value("20")

六、Select模块(text)
1.Select模块里面还有一个更加高级的功能,可以直接通过选项的文本内容来定位。
2.定位“每页显示50条”:select_by_visible_text("每页显示50条")

七、Select模块其它方法
1.select里面方法除了上面介绍的三种,还有更多的功能如下
select_by_index() :通过索引定位
select_by_value() :通过value值定位
select_by_visible_text() :通过文本值定位
deselect_all() :取消所有选项
deselect_by_index() :取消对应index选项
deselect_by_value() :取消对应value选项
deselect_by_visible_text() :取消对应文本选项
first_selected_option() :返回第一个选项
all_selected_options() :返回所有的选项

八、整理代码如下:
# 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(20)
# 鼠标移动到“设置”按钮
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()

# # 直接通过xpath定位
# driver.find_element_by_xpath(".//*[@id='nr']/option[2]").click()

# # 通过索引:select_by_index()
# s = driver.find_element_by_id("nr")
# Select(s).select_by_index(2)

# # 通过value:select_by_value()
# s = driver.find_element_by_id("nr")
# Select(s).select_by_value("20")

# 通过text:select_by_visible_text()
s = driver.find_element_by_id("nr")
Select(s).select_by_visible_text("每页显示50条")

九、select遇到的坑
1.在操作百度设置里面,点击“保存设置”按钮时,alert弹出框没有弹出来。(Ie浏览器是可以的)
2.分析原因:经过慢慢调试后发现,在点击"保存设置"按钮时,由于前面的select操作后,失去了焦点
3.解决办法:在select操作后,做个click()点击操作

s = driver.find_element_by_id("nr")
Select(s).select_by_visible_text("每页显示20条")
time.sleep(3)
s.click()

 

Selenium2+python自动化16-alert\confirm\prompt

 

alert\confirm\prompt弹出框操作主要方法有:
text:获取文本值
accept() :点击"确认"
dismiss() :点击"取消"或者叉掉对话框
send_keys() :输入文本值 --仅限于prompt,在alert和confirm上没有输入框

 

一、认识alert\confirm\prompt
1.先认清楚长什么样子,以后遇到了就知道如何操作了。
2.html源码如下(有兴趣的可以copy出来,复制到txt文本里,后缀改成html就可以了,然后用浏览器打开)

<html>
<head>
<title>Alert</title>
</head>
<body>
<input id = "alert" value = "alert" type = "button" onclick = "alert('您关注了yoyoketang吗?');"/>
<input id = "confirm" value = "confirm" type = "button" onclick = "confirm('确定关注微信公众号:yoyoketang?');"/>
<input id = "prompt" value = "prompt" type = "button" onclick = "var name = prompt('请输入微信公众号:','yoyoketang'); document.write(name) "/>
</body>
</html>

 

二、alert操作
1.先用switch_to_alert()方法切换到alert弹出框上
2.可以用text方法获取弹出的文本 信息
3.accept()点击确认按钮
4.dismiss()相当于点右上角x,取消弹出框

三、confirm操作
1.先用switch_to_alert()方法切换到alert弹出框上
2.可以用text方法获取弹出的文本 信息
3.accept()点击确认按钮
4.dismiss()相当于点取消按钮或点右上角x,取消弹出框

四、prompt操作
1.先用switch_to_alert()方法切换到alert弹出框上
2.可以用text方法获取弹出的文本 信息
3.accept()点击确认按钮
4.dismiss()相当于点右上角x,取消弹出框
5.send_keys()这里多个输入框,可以用send_keys()方法输入文本内容

 

#coding:utf-8
from selenium import webdriver
import time
# (url的路径,直接复制浏览器打开的路径)
url = "file:///c:/jjjjjjjjjjjjjjjjj/Desktop/testalert.html"
driver = webdriver.Firefox()
driver.get(url)
time.sleep(3)
driver.find_element_by_id("alert").click()
time.sleep(3)
t = driver.switch_to_alert()
#打印警告框文本内容
print t.text
t.send_keys('hello!!!')
#点警告框确认按钮
# t.accept()
# t.dismiss() #相当于点 x 按钮,取消

 

六、示例代码

 

# 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)
driver.implicitly_wait(20)

# 鼠标移动到“设置”按钮
mouse = driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(mouse).perform()
driver.find_element_by_link_text("搜索设置").click()

# 通过text:select_by_visible_text()
s = driver.find_element_by_id("nr")
Select(s).select_by_visible_text("每页显示20条")
time.sleep(3)
s.click()
driver.find_element_by_link_text("保存设置").click()
time.sleep(5)

# 获取alert弹框
t = driver.switch_to_alert()
print t.text
t.accept()

 

Selenium2+python自动化17-JS处理滚动条

 

selenium提供了一个操作js的方法:
execute_script(),可以直接执行js的脚本。

 


一、JavaScript简介
对js不太熟悉的,可以网上找下教程,简单了解些即可。
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是最底部。
(版权所有,微信公众号:yoyoketang)

 

三、横向滚动条
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语句做个判断

 

八、scrollTo函数
楼下有个小伙伴说这个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)

 


九、参考代码如下:

 


# coding:utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
print driver.name
## 回到顶部
#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)

 

#滚动到底部
js = "window.scrollTo(0,document.body.scrollHeight)"
driver.execute_script(js)

 

#滚动到顶部
js = "window.scrollTo(0,0)"
driver.execute_script(js)

 


# 聚焦元素
target = driver.find_element_by_xxxx()
driver.execute_script("arguments[0].scrollIntoView();", target)

 

 

 

 

Selenium2+python自动化18-加载Firefox配置

 

 

二、FirefoxProfile
1.profile_directory=None,如果没有路径,默认为None,启动的是一个新的,有的话就加载指定的路径。

 

三、profile_directory
1.问题来了:Firefox的配置文件地址如何找到呢?
2.打开Firefox点右上角设置>?(帮助)>故障排除信息>显示文件夹
3.打开后把路径复制下来就可以了:
C:\Users\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default

 

四、启动配置文件
1.由于文件路径存在字符:\ ,反斜杠在代码里是转义字符,这个有点代码基础的应该都知道。
2.遇到转义字符,为了不让转义,有两种处理方式:
第一种:\ (前面再加一个反斜杠)
第二种:r”\"(字符串前面加r,使用字符串原型)

五、参考代码:

 

# coding=utf-8
from selenium import webdriver
# 配置文件地址
profile_directory = r'C:\Users\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'
# 加载配置配置
profile = webdriver.FirefoxProfile(profile_directory)
# 启动浏览器配置
driver = webdriver.Firefox(profile)

 

 

Selenium2+python自动化19-单选框和复选框(radioboxcheckbox

 

 

二、radio和checkbox源码
1.上图的html源码如下,把下面这段复杂下来,写到文本里,后缀改成.html就可以了。

 

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>单选和复选</title>
</head>
<body>

</form>
<h4>单选:性别</h4>
<form>
<label value="radio">男</label>
<input name="sex" value="male" id="boy" type="radio"><br>
<label value="radio1">女</label>
<input name="sex" value="female" id="girl" type="radio">
</form>

<h4>微信公众号:从零开始学自动化测试</h4>
<form>
<!-- <label for="c1">checkbox1</label> -->
<input id="c1" type="checkbox">selenium<br>
<!-- <label for="c2">checkbox2</label> -->
<input id="c2" type="checkbox">python<br>
<!-- <label for="c3">checkbox3</label> -->
<input id="c3" type="checkbox">appium<br>

<!-- <form>
<input type="radio" name="sex" value="male" /> Male
<br />
<input type="radio" name="sex" value="female" /> Female
</form> -->

</body>
</html>

 

三、单选:radio
1.首先是定位选择框的位置
2.定位id,点击图标就可以了,代码如下
(获取url地址方法:把上面源码粘贴到文本保存为.html后缀后用浏览器打开,在浏览器url地址栏复制出地址就可以了)
3.先点击boy后,等十秒再点击girl,观察页面变化
四、复选框:checkbox
1.勾选单个框,比如勾选selenium这个,可以根据它的id=c1直接定位到点击就可以了
五、全部勾选:
1.全部勾选,可以用到定位一组元素,从上面源码可以看出,复选框的type=checkbox,这里可以用xpath语法:.//*[@type='checkbox']
2.这里注意,敲黑板做笔记了:find_elements是不能直接点击的,它是复数的,所以只能先获取到所有的checkbox对象,然后通过for循环去一个个点击操作
六、判断是否选中:is_selected()
1.有时候这个选项框,本身就是选中状态,如果我再点击一下,它就反选了,这可不是我期望的结果,那么可不可以当它是没选中的时候,我去点击下;当它已经是选中状态,我就不点击呢?那么问题来了:如何判断选项框是选中状态?
2.判断元素是否选中这一步才是本文的核心内容,点击选项框对于大家来说没什么难度。获取元素是否为选中状态,打印结果如下图。
3.返回结果为bool类型,没点击时候返回False,点击后返回True,接下来就很容易判断了,既可以作为操作前的判断,也可以作为测试结果的判断

 

七、参考代码:
# coding:utf-8
from selenium import webdriver
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

 

# 复选框单选
driver.find_element_by_id("c1").click()
# 复选框全选
checkboxs = driver.find_elements_by_xpath(".//*[@type='checkbox']")
for i in checkboxs:
i.click()

 

Selenium2+python自动化23-富文本(自动发帖)

 

 

富文本编辑框是做web自动化最常见的场景,有很多小伙伴遇到了不知道无从下手,本篇以博客园的编辑器为例,解决如何定位富文本,输入文本内容

 

一、加载配置
1.打开博客园写随笔,首先需要登录,这里为了避免透露个人账户信息,我直接加载配置文件,免登录了。
二、打开编辑界面
1.博客首页地址:bolgurl = "http://www.cnblogs.com/"
2.我的博客园地址:yoyobolg = bolgurl + "yoyoketang"
3.接下来就是重点要讲的富文本的编辑,这里编辑框有个iframe,所以需要先切换
四.点击“新随笔”按钮,id=blog_nav_newpost
三、iframe切换
1.打开编辑界面后先不要急着输入内容,先sleep几秒钟
2.输入标题,这里直接通过id就可以定位到,没什么难点
3、输入正文
1.这里定位编辑正文是定位上图的红色框框位置body部分,也就是id=tinymce
2.定位到之后,直接send_keys()方法就可以输入内容了
3.有些小伙伴可能输入不成功,可以在输入之前先按个table键,send_keys(Keys.TAB)

 


五、参考代码:
# 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)

 

 

Selenium2+python自动化24-js处理富文本(带iframe

 

 

一、参考代码
# 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()

 

 

 

 

Selenium2+python自动化25-js处理日历控件(修改readonly属性)

 

 

基本思路:先用js去掉readonly属性,然后直接输入日期文本内容
三、用js去掉readonly属性
1.用js去掉元素属性基本思路:先定位到元素,然后用removeAttribute("readonly")方法删除属性。
2.出发日元素id为:train_date,对应js代码为:'document.getElementById("train_date").removeAttribute("readonly");'
四、输入日期
1.输入日期前,一定要先清空文本,要不然无法输入成功的。
2.这里输入日期后,会自动弹出日历控件,随便点下其它位置就好了,接下来会用js方法传入日期,就不会弹啦!
五、js方法输入日期
1.这里也可以用js方法输入日期,其实很简单,直接改掉输入框元素的value值就可以啦

 

六、参考代码如下:

 

# coding:utf-8
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")

 

 

 

 

Selenium2+python自动化26-js处理内嵌div滚动条

 

# 无关紧要
https://www.cnblogs.com/yoyoketang/p/6188582.html

Selenium2+python自动化27-查看selenium API

 

# 无关紧要
https://www.cnblogs.com/yoyoketang/p/6189740.html

Selenium2+python自动化28-table定位

 

# 无关紧要
https://www.cnblogs.com/yoyoketang/p/6287962.html

Selenium2+python自动化29-js处理多窗口

 

 

在打开页面上链接的时候,经常会弹出另外一个窗口(多窗口情况前面这篇有讲解:Selenium2+python自动化13-多窗口、句柄(handle)),这样在多个窗口之间来回切换比较复杂,那么有没有办法让新打开的链接在一个窗口打开呢?

 

要解决这个问题,得从html源码上找到原因,然后修改元素属性才能解决。很显然js在这方面是万能的,于是本篇得依靠万能的js大哥了。

 

二、查看元素属性:target="_blank"
1.查看元素属性,会发现这些链接有个共同属性:target="_blank"

 

三、去掉target="_blank"属性
1.因为此链接元素target="_blank",所以打开链接的时候会重新打开一个标签页,那么解决这个问题,去掉该属性就可以了。
2.为了验证这个问题,可以切换到html编辑界面,手动去掉“_blank”属性
3.删除“_blank”属性后,重新打开链接,这时候会发现打开的新链接会在原标签页打开。

 

四、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"属性链接情况

 

 

 

 

Selenium2+python自动化-窗口多标签处理方法总结(转载)

https://www.cnblogs.com/yoyoketang/articles/6435919.html

Selenium2+python自动化-gird分布式(转载)

https://www.cnblogs.com/yoyoketang/articles/6435952.html

Selenium2+Python自动化-处理浏览器弹窗(转载)

https://www.cnblogs.com/yoyoketang/p/6486760.html

 

 

-----------待更新----------------------

 

 

 

Selenium2+python自动化33-文件上传(send_keys

Selenium2+python自动化34-获取百度输入联想词

Selenium2+python自动化35-获取元素属性

Selenium2+python自动化36-判断元素存在

Selenium2+python自动化37-爬页面源码(page_source

Selenium2+python自动化38-显式等待(WebDriverWait

Selenium2+python自动化39-关于面试的题

Selenium2+python自动化40-cookie相关操作

Selenium2+python自动化41-绕过验证码(add_cookie

Selenium2+python自动化42-判断元素(expected_conditions

Selenium2+python自动化43-判断titletitle_is

Selenium2+python自动化45-18种定位方法(find_elements

Selenium2+python自动化44-元素定位参数化(find_element

Selenium2+python自动化46-js解决click失效问题

Selenium2+python自动化47-判断弹出框存在(alert_is_present)

Selenium2+python自动化48-登录方法(参数化)

Selenium2+python自动化49-判断文本(text_to_be_present_in_element

selenium3+python自动化50-环境搭建(firefox

Selenium2+python自动化51-unittest简介

Selenium2+python自动化52-unittest执行顺序

Selenium2+python自动化53-unittest批量执行(discover

Selenium2+python自动化54-unittest生成测试报告(HTMLTestRunner

Selenium2+python自动化55-unittest之装饰器(@classmethod

Selenium2+python自动化56-unittest之断言(assert

Selenium2+python自动化57-捕获异常(NoSuchElementException

Selenium2+python自动化58-读取Excel数据(xlrd

Selenium2+python自动化59-数据驱动(ddt

Selenium2+python自动化60-异常后截图(screenshot

Selenium2+python自动化61-Chrome您使用的是不受支持的命令行标记:--ignore-certificate-errors

Selenium2+python自动化62-jenkins持续集成环境搭建

Selenium2+python自动化63-简易项目搭建

Selenium2+python自动化64-100(大结局)[已出书]

 

 

selenium+pythonmac环境上的搭建

jenkins显示html样式问题的几种解决方案总结

Pycharmpythonunittest两种姿势傻傻分不清楚

selenium+python自动化77-autoit文件上传

selenium+python自动化79-文件下载(SendKeys

selenium+python自动化81-html报告优化(饼图+失败重跑+兼容python2&3

selenium+python自动化82-只截某个元素的图

selenium+python自动化83-pip安装seleniumRead time out HTTPSConnectionPool(host='pypi.python.org' port443

selenium+python自动化84-chrome手机wap模式(登录淘宝页面)

selenium+python自动化85-python3.6SendKeys报错用PyUserInput取代

selenium+python自动化86-Chrome正在受到自动软件的控制

selenium+python自动化87-Chrome浏览器静默模式启动(headless

selenium+python自动化89-用例不通过的时候发送邮件

selenium+python自动化90-unittest多线程执行用例

selenium+python自动化91-unittest多线程生成报告(BeautifulReport

selenium+python自动化92-多线程启动多个不同浏览器

python+selenium+requests爬取我的博客粉丝的名称

selenium+python自动化93-Chrome报错:Python is likely shutting down

selenium+python自动化94-行为事件(ActionChains)源码详解

selenium+python自动化95-弹出框死活定位不到

selenium+python自动化96-执行jquery:$ is not defined

selenium+python自动化97--unittest参数化(paramunittest

pycharm最新版新建工程没导入本地包问题:module 'selenium.webdriver' has no attribute 'Firefox'

Selenium2+python自动化75-input文件上传(SendKeys

selenium+python自动化98--文件下载弹窗处理(PyKeyboard)

selenium+python自动化78-autoit参数化与批量上传

selenium+python自动化80-文件下载(不弹询问框)

Selenium2+python自动化73-定位的坑:class属性有空格