目录
3)find_element_by_class_name定位
5)driver.find_elements_by_css_selector定位
2)document.getElementByClassName()
零、学习进度进度记录
一、工具准备:
- python
- pycharm
- selenium库
- chrome driver
二、准备步骤
1.E:\conda>pip install selenium //安装selenium库
2.pip show selenium //查看版本信息
3.驱动地址:http://chromedriver.stage.googleapis.com/index.html,配置好chrome driver后,在系统环境path添加浏览器驱动的路径
4.打开百度首页,鼠标操作步骤如下:1->2(doble click)->3
5.按住键盘F12,可以观察到百度文本框对应的元素,selenium工具通过识别这些属性来进行测试 :
- 等号左边 元素的属性
- 等号右边 属性值
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
6.简单测试:
from selenium import webdriver
driver = webdriver.Chrome()若提示:PyCharm:ModuleNotFoundError: No module named 'selenium'
1.检查selenium模块是否安装成功:
1)打开cmd控制台,输入python,
2)输入from selenium import webdriver,
3)没报错,则说明成功安装selenium包。
C:\Users\Administrator>python Python 3.8.3 (default, Jul 2 2020, 17:30:36) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from selenium import webdriver
2.检查pycharm是否将python路径设置错误
1)查看pycharm输出控制台处,第一行即为使用的python.exe的路径,
2)改为你需要的python.exe路径:所需要的指的是,运行路径下包含selenium所需模块(pip、selenium、setuptools模块)
- 点击file
- 点击setting
- 点击Project:你所建立的工程
- 点击Python interpreter,查看当前路径下模块,
- 更换路径,查看更换后路径下模块
参考:https://www.cnblogs.com/zhuzhu1214/p/10027609.html
3)再次运行代码,运行成功
三、元素定位实战
1.单个元素定位实战
1)find_element_by_id定位
需要ctrl+F或者选中目标域找到目标参数
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.find_element_by_id("kw").send_keys('小罗今天也要努力')
2)find_element_by_name定位
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.find_element_by_name("wd").send_keys('hello net')
3)find_element_by_class_name定位
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.find_element_by_class_name("s_ipt").send_keys('小罗加油哟')
4)xpath定位👍👍👍
XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言。工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到。这个时候就需要自己手动的去写xpath了,
如图:
1.要定位的input这个标签,可以先找到它老爸的id=s_kw_wrap;
2.要是它老爸的属性也不是很明显,就找它爷爷id=form。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
#定位自己
driver.find_elements_by_xpath("//input[@name='wd']")[0].send_keys('223')
#定位父标签(失败?)
driver.find_elements_by_xpath("//span[@id='s_kw_wrap']/input")[0].send_keys('223')
#定位爷标签
driver.find_elements_by_xpath("//form[@id='form']/span/input")[0].send_keys('嘿嘿')
#使用两个属性(id和class)定位一个标签(input),增强元素唯一性
driver.find_elements_by_xpath("//input[@id='kw' and @class='s_ipt']")[0].send_keys('223')
XPath资料参考😝:
【3】小坑:‘list‘ object has no attribute ‘send_keys‘】错误解决方法
如:要获取csdn文章title文本框的Xpath:
获取Xpath路径方法:F12,选中代码,右键复制,选择Xpath或CSS,粘贴可得:
//*[@id="txtTitle"]
5)driver.find_elements_by_css_selector定位
注意:该方法返回一个列表对象
#1.input标签下含属性id,id值为kw,在css定位中id简写用#表示
driver.find_elements_by_css_selector("input#kw")[0].send_keys('heiheihei')
#2.form标签下含属性id,id值为form。层级关系用>表示
driver.find_elements_by_css_selector("form#form>span>input")[0].send_keys('heiheihei')
#3.form标签下含属性id,id值为form。层级关系省略>,以空格表示
driver.find_elements_by_css_selector("form#form span input")[0].send_keys('heiheihei')
2.多个元素定位
如F12百度首页调试界面,整个页面中值为span id= s_kw_wrap的标签下 ,ctrl+f查找关键字“hidden”,含type属性值=hidden的元素有10个,
tag=driver.find_elements_by_tag_name('input')
for t in tag:
if t.get_attribute('autocomplete')=='off':
t.send_keys('一个中国')
#点击百度一下
driver.find_element_by_id('su').click()
3.使用by类定位
from selenium import webdriver
#导入By类
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.find_element(By.ID,'kw').send_keys('2020年11月26日')
driver.find_element(By.ID,'s-top-left').click()
4.使用javascript定位
1)document.getElementById()
from selenium import webdriver
import time as t
dr = webdriver.Chrome()
dr.get('https://www.jianshu.com')
# 登陆
# js_register = 'document.getElementById("sign_in").click();'
# 注册
# js_register = 'document.getElementById("sign_up").click();'
dr.execute_script(js_register)
print("网页标题:", dr.title)
注意:execute_script()方法用于调用js方法来执行Javascript脚本
运行结果:pycharm控制台交互端打印跳转前/后的网页标题,网页自动跳转至简书登陆/注册界面。
2)document.getElementByClassName()
在日常的网页源码中,我们基于元素的id去定位是最万无一失的,id在单个页面中是不会重复的。但是实际工作中,很多前端开发人员并未给每个元素都编写id属性。通常一段html代码如下,这个例子中,最外层的div就没有id属性,此时,可以基于class属性来定位元素。
- 用js-Class定位简书界面的二维码,并执行单击操作:
from selenium import webdriver
import time as t
dr = webdriver.Chrome()
dr.get('https://www.jianshu.com')
print("网页标题1:", dr.title)
t.sleep(2)
#二维码区域的class属性值=qrcode
js_class='document.getElementsByClassName("qrcode")[0].click();'
dr.execute_script(js_class)
#用于测试上一步是否执行成功
print("网页标题2:", dr.title)
运行结果:pycharm控制台交互端打印跳转前/后的网页标题,网页自动跳转至二维码界面。
class元素定位参考文章https://www.cnblogs.com/new-june/p/9599331.html
- 定位密码文本框 getElementsByTagName()
from selenium import webdriver
import time as t
dr = webdriver.Chrome()
dr.get('https://www.jianshu.com')
print("网页标题1:", dr.title)
js_password = 'document.getElementsByTagName("input")[1].value="password";'
dr.execute_script(js_password)
print("网页标题2:", dr.title)
5.使用jQuery定位
四、下拉框实战
1.value属性定位
2.index属性定位
3.visible_text属性定位
4.元素二次定位
五、鼠标操作实战
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
dr = webdriver.Chrome()
dr.get('https://www.baidu.com')
sleep(1)
mouse = dr.find_element_by_link_text("更多")#按文本定位
print('ok')
ActionChains(dr).move_to_element(mouse).perform()#悬停
ActionChains(dr).context_click(mouse).perform()#右键单击
ActionChains(dr).click(mouse).perform()#左键单击
ActionChains(dr).double_click(mouse).perform()#左键双击
六、元素等待实战
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support import expected_conditions
dr = webdriver.Chrome()
dr.get("http://www.baidu.com")
# #强制等待
# sleep(5)
# dr.find_element_by_id('kw').send_keys('hihi')
# #隐式等待
# dr.implicitly_wait(30)#找到元素就操作了
# dr.find_element_by_id('kw').send_keys('双击一下')
#显示等待
WebDriverWait(dr, 15, 0.5).until(expected_conditions.title_contains("百度一下"))
print('ok')
dr.quit()
七、表单切换实战
八、窗口切换实战
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
dr = webdriver.Chrome()
dr.get('https://www.baidu.com')
sleep(1)
mouse = dr.find_element_by_link_text("更多").click()
#鼠标操作
# ActionChains(dr).move_to_element(mouse).perform()#悬停
# ActionChains(dr).context_click(mouse).perform()#右键单击
# ActionChains(dr).click(mouse).perform()#左键单击
# ActionChains(dr).double_click(mouse).perform()#左键双击
#window_handles 用来获取所有窗口,并返回一个list对象,然后通过switch_to.window([index])方法来获取指定窗口,如windows(1)表示切换到第二个窗口
windows=dr.window_handles#获取所有窗口句柄
dr.switch_to.window(windows[-1])#切换至当前最新窗口
dr.find_element_by_id("kw").send_keys('AI识别')#在百度搜索栏输入文本“AI识别”
dr.find_element_by_id("su").click()#单击按钮“百度一下”
dr.find_element_by_link_text("资讯").click()#单击元素“资讯”
dr.switch_to.window(windows[0])#切换至第一个窗口
dr.find_element_by_link_text("更多").click()
dr.switch_to.window(windows[-1])#切换至最新窗口
dr.switch_to.window(windows[0])#切换至第2个窗口
九、警告框实战
测试中国航空首页无条件搜索,不输入任何值得情况下点击查询预定,弹出警告框,测试输出警告框文本值至控制台 。
- 使用switch_to()方法接收警告框,此方法相当于单击警告框里的“确认”按钮
- 使用
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select
dr = webdriver.Chrome()
dr.get('http://www.airchina.com.cn/?cid=PINZHUAN:20201027:PZH:baidu:CHN:001001')
dr.find_element_by_id('portalBtn').click()
alert = dr.switch_to.alert
print(alert.text)
alert.dismiss()#取消/拒绝警告框
alert.accept()#确认警告框
#这个警告框无论使用dissmiss()和accept()结果都一样,销毁警告框
十、JAVAscript实战
十一、unittest单元测试框架
请看我的博客:https://luoyiran.blog.csdn.net/article/details/113538053
具体函数学习,请看我的博客:https://luoyiran.blog.csdn.net/article/details/116485795
十二、数据驱动测试实战
十三、发送邮件实战
请查看我的博客:python 发送 SMTP邮件实战
十四、测试框架封装和脚本的分层设计
十五、自动化测试苦战应用实战