python+selenium入门
```python
培训内容整合
1、什么是selenium/自动化测试
Selenium是一个用于Web应用程序的自动化测试工具
自动化测试,就是把手工进行的测试过程,转变成机器自动执行的测试过程-------通过机器去完成手工测试的过程
python+selenium环境搭建
**使用的工具集
IDE: Jetbrains PyCharm
语言: Python
工具: Selenium WebDriver
**安装python
**通过pip install selenium 安装selenium,验证是否安装成功:pip show selenium
**安装浏览器---Chrome、Firefox、IE
**下载浏览器驱动
下载浏览器对应的driver,.浏览器版本必须要和驱动版本对应,否则会出现调用不起来浏览器或者无法打开网页的问题
浏览器版本与driver对应关系,网址:http://www.cnblogs.com/JHblogs/p/7699951.html;
driver下载地址:http://chromedriver.storage.googleapis.com/index.html 将下载的.exe文件放置在python根目录即可
**验证浏览器与驱动是否匹配
from selenium import webdriver #webdriver可以认为是浏览器的驱动器
import time
driver=webdriver.Chrome()
driver.maximize_window()
time.sleep(2)
driver.get("https://www.baidu.com")
2、web元素定位方法有哪些?
1、id find_element_by_id 通过元素id定位
2、name find_element_by_name 通过元素name定位
3、class find_element_by_class_name 通过类名进行定位
4、tagname find_element_by_tag_name 通过标签定位
5、linktext find_element_by_link_text 通过完整超链接定位
6、patiallinktext find_element_by_partial_link_text 通过部分链接定位
7、xpath find_element_by_xpath 通过xpath表达式定位
8、cssselector find_element_by_css_selector 通过css选择器进行定位
3、xpath定位的方法
1、xpath之绝对路径定位
绝对路径:从根目录(/)开始,一级一级找到目标路径
例如:driver.find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input")
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input").send_keys("驰声")
2、相对路径定位
相对路径:从//开始,从选择的元素集去找到目标元素
driver.find_element_by_xpath("//form/span/input").send_keys("驰声")
3、通过索引定位
标签[N]
例如:driver.find_element_by_xpath("//form/span[1]/input").send_keys("驰声")
4、通过属性定位
1)通过唯一属性值定位
driver.find_element_by_xpath("//input[@id='kw']").send_keys("驰声")
2)通过同时匹配多个属性值定位 多个属性值之间用and/or
driver.find_element_by_xpath("//input[@id='kw' and @name='wd']").send_keys("驰声")
5、通过部分属性值定位
函数:
1)contains(@属性名,属性值) 模糊匹配属性值
2)substring(@属性,n) n指的是开始截取的下标 截取属性值
3)starts-with(@属性名,属性值) 属性值以什么开头
#通过部分属性值匹配
driver.find_element_by_xpath("//input[contains(@autocomplete,'ff')]").send_keys("驰声")
driver.find_element_by_xpath("//input[substring(@class,3)='ipt']").send_keys("驰声")
driver.find_element_by_xpath("//input[starts-with(@class,'s_')]").send_keys("驰声")
6、通过文本进行定位
函数:text()
#通过文本进行定位
driver.find_element_by_xpath("//div[@id='u1']/a[text()='新闻']").click()
selenium常用的操作
**一、浏览器操作
#导入selenium
from selenium import webdriver
#创建chrome驱动实例,打开浏览器
driver=webdriver.Chrome()
#浏览器最大化
driver.maximize_window()
#浏览器最小化
driver.minimize_window()
#获取浏览器当前窗口大小
size=driver.get_window_size()
#设置浏览器窗口大小
driver.set_window_size(400,400)
#打开指定网页
driver.get("http://www.so.com")
#获取当前页面的链接地址
url=driver.current_url
driver.get("http://baike.so.com")
#后退
driver.back()
#前进
driver.forward()
#刷新
driver.refresh()
#浏览器退出
driver.close()
driver.quit()
#截图
driver.get_screenshot_as_file("filename")
driver.save_screenshot("filename")
#切换到当前被操作元素
ele=driver.switch_to.active_element
#切换alert、confirm、prompt框
alert = driver.switch_to.alert()
#对话框操作
driver.switch_to_alert() #选择窗口对象
driver.accept() #点击确认
driver.dismiss() #点击取消
driver.send_keys("key") #输入值ֵ
#切换到默认页面
driver.switch_to.default_content()
#切换iframe
driver.switch_to.frame('frame_name')
**二、元素定位
input type="text" name="q" class="placeholder" id="input" suggestwidth="540px" autocomplete="off">
driver.find_element_by_id("input")
driver.find_element_by_name("q")
driver.find_element_by_class_name("placeholder")
driver.find_element_by_tag_name("input")
#通过link_text定位
<a href="http://www.so.com/link?m=aet4cncwddniEaPk6dHXguMLtzsuEZCshH9NOP1B83PNdna1JVlAE2E5xzKeyB2GUQSR9o8wo4KTK5n7ApE28%2FQ%3D%3D" data-url="http://ly.so.com/?src=tab_web" data-s="http://ly.so.com/s?q=%q%&src=tab_web" data-linkid="liangyi">良医</a>
driver.find_element_by_link_text("良医")
driver.find_element_by_partial_link_text("医")
css定位
具有很强的灵活性,同时使用也是相对复杂
常见符号:
#表示 id选择器
.表示 class选择器
>表示子元素,层级
一个空格也表示子元素,但是是所有的后代子元素
#<input type="text" name="q" class="placeholder" id="input" suggestwidth="540px" autocomplete="off">
#通过标签定位
driver.find_element_by_css_selector("input")
#通过id定位
driver.find_element_by_css_selector("#input")
#通过class定位
driver.find_element_by_css_selector(".placeholder")
#通过属性定位
driver.find_element_by_css_selector('[name="q"]')
#以上都是单一形式的定位,上面的所有形式都可以进行组合定位
driver.find_element_by_css_selector("input#input")
driver.find_element_by_css_selector("#input[name='q']")
**三、元素操作
#清除文本框内容
input_element.clear()
#点击操作
input_element.click()
#对文本框输入
input_element.send_keys()
#提交表单
input_element.submit()
#获取元素指定属性的值
input_element.get_attribute("name")
input_element.get_property("name")
#获取元素的大小
ele_size=input_element.size
#获取该元素的子元素
input_element.find_element()
#判断元素是否显示
input_element.is_displayed()
#判断元素是否可以使用
input_element.is_enabled()
#判断元素是否是选中状态
input_element.is_selected()
#查看元素的标签名
input_tag=input_element.tag_name
*****等待的三种类型:
1、强制等待:time.sleep()
说明:无论情况如何,运行到等待时,都会必须等待指定的时间长度。再继续进行后续的操作
缺点:过于死板,而且耗费时间太多
优点:很简单。在调试的时候,一般而言会有奇效
2、隐式等待:driver.implicitly_wait(10)
说明:设置一个全局的隐形的等待,设置最大等待时间,如果说在时间内完成了整个页面的加载,则进行下一步,否则,等待最大等待时间截止,进行下一步
缺点:必须等待页面全部加载完成,才能进行下一步操作,如果需要对页面特定的元素进行操作,元素已经加载完成,但是页面未加载完成,则必须等待页面加载完,才能进行后续的操作,且没有办法准确地对某一个指定的元素进行等待
优点:能对整个WebDriver产生作用,所以只需要设置一次即可,一般用于做统一的等待
3. 显示等待:WebDriverWait()
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver,最大等待时间,检查频率).until()
说明:设置一个等待的条件,在设置的最大时间内,依照指定的频率进行元素的查找,Until方法表示,如果找到则进行下一步操作,否则,报出异常NoSuchElementException/Timeout,Until_Not()与Until相反
缺点:应用上,比较其他两种方式更为复杂,一次性等待
优点:最大化节约测试时间,精准的对指定的元素进行等待
断言:
在测试用例中,执行完测试用例后,最后一步是判断测试结果是pass还是fail,自动化测试脚本里面一般把这种生成测试结果的方法称为断言(assert)。
基本的断言方法提供了测试结果是True还是False。所有的断言方法都有一个msg参数,如果指定msg参数的值,则将该信息作为失败的错误信息返回。
序号 断言方法 断言描述
1 assertEqual(arg1, arg2, msg=None) 验证arg1=arg2,不等则fail
2 assertNotEqual(arg1, arg2, msg=None) 验证arg1 != arg2, 相等则fail
3 assertTrue(expr, msg=None) 验证expr是true,如果为false,则fail
4 assertFalse(expr,msg=None) 验证expr是false,如果为true,则fail
5 assertIs(arg1, arg2, msg=None) 验证arg1、arg2是同一个对象,不是则fail
6 assertIsNot(arg1, arg2, msg=None) 验证arg1、arg2不是同一个对象,是则fail
7 assertIsNone(expr, msg=None) 验证expr是None,不是则fail
8 assertIsNotNone(expr, msg=None) 验证expr不是None,是则fail
9 assertIn(arg1, arg2, msg=None) 验证arg1是arg2的子串,不是则fail
10 assertNotIn(arg1, arg2, msg=None) 验证arg1不是arg2的子串,是则fail
11 assertIsInstance(obj, cls, msg=None) 验证obj是cls的实例,不是则fail
12 assertNotIsInstance(obj, cls, msg=None) 验证obj不是cls的实例,是则fail
--错误处理
python内置了一套try...except...finally...的错误处理机制
try:
print('try...')
r = 10 / 0
print('result:', r)
except ZeroDivisionError as e:
print('except:', e)
finally:
print('finally...')
print('END')
当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。
上面的代码在计算10 / 0时会产生一个除法运算错误:
try...
except: division by zero
finally...
END
从输出可以看到,当错误发生时,后续语句print('result:', r)不会被执行,except由于捕获到ZeroDivisionError,因此被执行。最后,finally语句被执行。然后,程序继续按照流程往下走。
---没有错误发生,所以except语句块不会被执行,但是finally如果有,则一定会被执行(可以没有finally语句)
*********
from selenium import webdriver
import time
#驱动360极速浏览器
chrome_options = webdriver.ChromeOptions()
chrome_options.binary_location = r'D:\ProgramFiles\360极速浏览器\360Chrome\Chrome\Application\360Chrome.exe' #这里是360极速浏览器的路径
chrome_options.add_argument("user-data-dir=d:\\programfiles\\360极速浏览器\\360chrome\\chrome\\User Data\\Default");#解决内核版本69打开后弹出皮肤设置窗口的问题
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.maximize_window()
time.sleep(2)
driver.get("https://www.baidu.com")
```

浙公网安备 33010602011771号