Selenium是自动化浏览器的工具包, 从应用的源头(浏览器)驱动应用,使用广泛(主流浏览器厂商的支持),可控制成本,提高效率
Selenium工具包有什么?
1.RC--Selenium 1, 没用过。
2.webdriver --Test Script using webdriver client libraries supported in java, ruby, python and etc.
大概流程: 脚本 - > Driver(chrome driver, friefox driver,ie Driver)- >浏览器- >web server hosting
-提供自动化的各种语言调用接口库
-通过各种浏览器驱动来驱动浏览器
3.selenium ide,没必要用啊。
4.selenium grid -可以用来在多台机器上同时执行selenium自动测试,用于用例非常多, 测试耗时长
html元素的属性
-- 属性在hmtl元素开始标签中规定
--一个元素可以有很多属性
--属性以键值对形式出现
执行webdriver.Chrome() 时在任务管理器中除了有Chrome的进程, 还有chromedriver的。
driver.get() 要在webdriver.chrome加载完后再执行
Selenium自动化主要是:(感觉世界上所有的UI自动化都是这样)
1.选择界面元素
2.操作界面元素
--输入操作:点击,输入文字, 拖曳
--输出操作:获取元素的各种属性
3. 根据界面上获取的数据进行分析和处理(编程语言处理)
选择元素:
1, Webdriver对象: 操作整个浏览器和当前整个页面, 可以执行下面的操作
-获取页面上的选择符合查找条件的对象
-打开网址,回退,前进,刷新网页
-获取,改变浏览器窗口大小,关闭浏览器,截屏
-获取,设置cookies
2, webElement对象: 操作对应web元素
-当前web元素的所有子元素里面符合查找条件的对象
-操作该web元素,比如:
-点击元素
-输入字符
-获取元素坐标,尺寸,文本内容, 其它的属性信息
通过id选择元素: 效率最高,优先使用
两种写法:1. driver.find_element_by_id('kw')
2.from selenium.webdriver.common.by import By
driver.find_element(By.ID, value='kw')
没有找到元素,抛出下面异常:
selenium.common.exceptions.NoSuchElementException
获取元素信息:
-text属性 : 显示该元素在web页面上的文本
-get_attribute()方法
-获取某个元素的href属性值,如:
ele = driver.find_element()
ele.get_attribute(("href"))
-获取某个元素的html源代码
ele = driver.find_element()
ele.get_attribute("outerHTML")
-获取某个元素的内部部分的html源代码
ele = driver.find_element()
ele.get_attribute("innerHTML")
-所有方法无法获取到后,用上面那种方法, 将代码取下来后, 用Beautiful Soup 在本地做分析
通过用bs与selenium两种技术融合使用,达到我们的目的
隐式等待:
driver.implicity_wait(10) --这个driver所影响的所有的find_element的操作
显示等待:
为一个操作专门指定等待时间
from selenium.webdriver.support.ui import Webdriver
from selenium.webdriver.support import expected_conditoins as EC
方法1:
ele = WebDriverWait(driver).until(EC.presence_of_element_located(By.ID,'username'))
方法2:
WebDriverWait(driver,10).until(lambda x:x.find_element_by_id("elementID"))
我喜欢用的小技巧:
1. 先设置隐式等待,为一些时间特别长的操作设置特定操作
2. 或者将driver.implicity_wait(10)先改为60S, 做完后再改回10S, 就可以不要这个显示等待
PO模式 Page Object 减少重复代码, 分层, 好维护
每个页面一个类, 元素和方法放在一个类里
我喜欢的一些小方法,如果要定位的元素没有ID, 就继续往上继续找ID,然后在ID下查找
定位不到元素时,考虑下是否在不同的frame里。
导航栏放在iframe外, 点击按钮
frameset
iframe
frame
切换以iframe里面
driver.switch_to_frame(frame_reference)
frame_reference 可以是
1. name或者ID
2. 索引index
3. frame所对应的WebElement: find_element返回的
元素找不到:
1.加载太慢
2.在其他的frame里
Cookies处理
cookie = driver.get_cookies()
driver.find_element_by_css_selector(“input.logging”).submit()#用于对信息进行提交,也可以使用click()进行代替,submit()要求提交对象是一个表单,click()更强调事件的独立性