WebDriver运行原理 执行 selenium 测试过程:
工程师写的自动化测试代码:自动化测试代码发送请求给浏览器的驱动(Chrome驱动,FireFox驱动)
浏览器驱动:解析自动化测试代码,解析后将其发送给浏览器
浏览器:执行浏览器驱动发来的指令,完成工程师想要的操作
Selenium WebDriver 如何与浏览器通信:
对于每一条 selenium 脚本,对应一个 http 请求会被创建并且发送给浏览器的驱动;
浏览器驱动中包含了一个 HTTP Server,接受 http 请求;
HTTP Server 接受到请求后根据请求来具体控制浏览器;
浏览器执行具体的测试步骤;
浏览器将步骤执行结果返回给 HTTP Server;
HTTP Server 将结果返回给 Selenium 脚本,如果是错误的 http 代码则会在控制台中看到报错信息;
WebDriver的协议:
WebDriver使用的协议是:JSON Wire protocol
通信的数据格式是 json
元素定位的8种方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import timefrom selenium import webdriverfrom selenium.webdriver.common.by import Byclass TestCase (object ): def __init__ (self ): self .driver = webdriver.Chrome() self .driver.get("http://www.baidu.com" ) self .driver.maximize_window() time.sleep(1 ) def execute_click_su (self ): self .driver.find_element_by_id('su' ).click() time.sleep(3 ) def quit_driver (self ): self .driver.quit()
最常用的是使用 id 来定位:
1 2 3 4 5 6 def test_id (self ): element = self .driver.find_element_by_id('kw' ) element.send_keys('selenium' ) print (type (element)) self .execute_click_su()
元素名定位:
1 2 3 4 5 6 def test_name (self ): element = self .driver.find_element_by_name('wd' ) element.send_keys('selenium' ) self .execute_click_su()
链接文本定位:
1 2 3 4 5 6 7 8 9 10 11 def test_linktext (self ): self .test_id() self .driver.find_element_by_link_text("百度首页" ).click() time.sleep(3 ) def test_partial_linktext (self ): self .test_id() self .driver.find_element_by_partial_link_text("首页" ).click() time.sleep(3 )
xpath 定位
1 2 3 4 5 6 def test_xpath (self ): self .driver.find_element_by_xpath("//input[@id='kw']" ).send_keys("github" ) self .execute_click_su() time.sleep(3 )
tag 标签定位
1 2 3 4 5 6 7 8 9 10 11 12 def test_tag (self ): element = self .driver.find_elements_by_tag_name('input' ) for i in range (17 ): try : element[i].send_keys('git' ) self .execute_click_su() time.sleep(3 ) except Exception as e: print (e) print (element)
css selector 定位
1 2 3 4 5 def test_css_selector (self ): self .driver.find_element_by_css_selector('#kw' ).send_keys('github' ) self .execute_click_su() time.sleep(3 )
类名定位
1 2 3 4 5 def test_class_name (self ): self .driver.find_element_by_class_name('s_ipt' ).send_keys('github' ) self .execute_click_su() time.sleep(3 )
通用的指定定位方式来定位
1 2 3 4 5 def test_all (self ): self .driver.find_element(By.ID, value='kw' ).send_keys('git' ) self .execute_click_su() time.sleep(3 )
运行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 if __name__ == '__main__' : case = TestCase() case .test_id() case .test_name() case .test_linktext() case .test_partial_linktext() case .test_xpath() case .test_tag() case .test_css_selector() case .test_class_name() case .test_all() case .quit_driver()
封装写法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import timefrom selenium import webdriverfrom selenium.webdriver.common.by import Bydef get_element (driver, *loc ): element = driver.find_element(*loc) return element if __name__ == '__main__' : driver = webdriver.Chrome() driver.get("http://www.baidu.com" ) loc1 = (By.ID, 'kw' ) get_element(driver, *loc1).send_keys("pornhub" ) get_element(driver, By.ID, 'su' ).click() time.sleep(3 ) driver.quit()
Selenium WebDriver 属性
#
属性
属性描述
1
driver.name
浏览器名称
2
driver.current_url
当前url
3
driver.title
当前页面标题
4
driver.page_source
当前页面源码
5
driver.current_window_handle
窗口句柄
6
driver.window_handles
当前窗口所有句柄
Selenium WebElement WebElement 属性 使用 WebDriver 的 find 方法定位到元素后,会返回一个 WebElement 对象,该对象用来描述 web 页面上的一个元素。
WebElement 常用属性:
#
属性
属性描述
1
id
标示
2
size
宽高
3
rect
宽高和坐标
4
tag_name
标签名称
5
text
文本内容
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import timefrom selenium import webdriverfrom selenium.webdriver.remote.webelement import WebElementclass TestCase (object ): def __init__ (self ): self .driver = webdriver.Chrome() self .driver.get("http://sahitest.com/demo/linkTest.htm" ) def test_webelement_prop (self ): e = self .driver.find_element_by_id('t1' ) print (type (e)) if __name__ == '__main__' : case = TestCase() case .test_webelement_prop()
通过 debug 查看:
常用方法
#
方法
方法描述
1
send_keys()
输入内容
2
clear()
清空内容
3
click()
单击
4
get_attribute()
获得属性值
5
is_selected()
是否被选中
6
is_enabled()
是否可用
7
is_displayed()
是否显示
8
value_of_css_property()
css属性值
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def test_webElement_method (self ): e = self .driver.find_element_by_id('t1' ) e.send_keys('test selenium' ) time.sleep(2 ) print (e.get_attribute('type' )) print (e.get_attribute('name' )) print (e.get_attribute('value' )) print (e.value_of_css_property('font' )) print (e.value_of_css_property('color' )) time.sleep(2 ) e.clear() def test_webElement_method2 (self ): form_ele = self .driver.find_element_by_xpath("//input[@id='t1']" ) form_ele.find_element_by_id('t1' ).send_keys('666' )
方法截图: