自动化测试工具Selenium的基本使用方法

简介: 自动化测试工具Selenium的基本使用方法

一、前言

由于requests模块是一个不完全模拟浏览器行为的模块,只能爬取到网页的HTML文档信息,无法解析和执行CSS、JavaScript代码,因此需要我们做人为判断;

selenium模块本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器;由于selenium解析执行了CSS、JavaScript所以相对requests它的性能是低下的;

二、selenium基本使用

import time from selenium import webdriver#驱动浏览器 from selenium.webdriver import ActionChains #滑动 from selenium.webdriver.common.by import By #选择器 from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #键盘按键操作 from selenium.webdriver.support import expected_conditions as EC #等待所有标签加载完毕 from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素 browser=webdriver.Chrome() #调用Chrome 驱动,生成浏览器对象 wait=WebDriverWait(browser,10) #设置selenium等待浏览器加载完毕的最大等待时间 try: browser.get('https://www.baidu.com/') baidu_input_tag=browser.find_element_by_id("kw") #寻找到百度页面的id='kw'的标签 key=baidu_input_tag.send_keys('张根') #在标签中输入'张根' baidu_button_tag=browser.find_element_by_id('su') #寻找到百度页面id='su'的标签 baidu_button_tag.click() #点击 wait.until(EC.presence_of_element_located((By.ID,'4'))) #等待百度页面 ID='4'的标签完毕,最大等待10秒 ''' 请求相关: browser.get('url') 响应相关: print(browser.page_source) #显示网页源码 print(browser.current_url) #获取当前url print(browser.get_cookies()) #获取当前网页cokies ''' finally: time.sleep(5) browser.close() #关闭浏览器

三、selenium选择器

模拟浏览器无非请求---->显示页面----->寻找标签 ------>点击标签的事件,所以selenium的关键是怎么找到页面中的标签,进而触发标签事件;

1.通过标签id属性进行定位

browser.find_element(By.ID,'kw').send_keys("美女") browser.find_element_by_id('kw').send_keys('性感')

2.通过标签name属性进行定位

browser.find_element_by_name("wd").send_keys("Linux") browser.find_element(By.NAME,'wd').send_keys("美女")

3.通过标签名进行定位

browser.find_element_by_tag_name("input").send_keys("selenium") browser.find_element(By.TAG_NAME, 'input').send_keys('aaa')

4.通过CSS查找方式进行定位

browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('python django') browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('python 之美')

5.通过xphan方式定位

browser.find_element_by_xpath('//*[@id="kw"]').send_keys("python Tornado") browser.find_element(By.XPATH, '//*[@id="kw"]').send_keys('吐槽大会')

6.通过搜索 页面中 链接进行定位

有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link

browser.find_element_by_link_text("新闻").click()

7.通过搜索 页面中 链接进行定位 ,可以支持模糊匹配

browser.find_element_by_partial_link_text("新").click() browser.find_element_by_partial_link_text("闻").click()

8.小结

上述均可以改写成find_element(By.ID,'kw')的形式

find_elements_by_xxx的形式是查找到多个元素,结果为列表 import time from selenium import webdriver#驱动浏览器 from selenium.webdriver import ActionChains #滑动 from selenium.webdriver.common.by import By #选择器 from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #键盘按键操作 from selenium.webdriver.support import expected_conditions as EC #等待所有标签加载完毕 from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素 browser=webdriver.Chrome() #调用Chrome 驱动,生成浏览器对象 wait=WebDriverWait(browser,10) #设置selenium等待浏览器加载完毕的最大等待时间 try: browser.get('https://www.baidu.com/') #通过标签id属性进行定位 # browser.find_element(By.ID,'kw').send_keys("美女") # browser.find_element_by_id('kw').send_keys('性感') #通过标签name属性进行定位 # browser.find_element_by_name("wd").send_keys("Linux") # browser.find_element(By.NAME,'wd').send_keys("美女") #通过标签名称进行定位 # browser.find_element_by_tag_name("input").send_keys("selenium") # browser.find_element(By.TAG_NAME, 'input').send_keys('aaa') # 通过CSS查找方式进行定位 # browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('python django') # browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('泰山') # 通过xphan方式定位 # browser.find_element_by_xpath('//*[@id="kw"]').send_keys("python Tornado") # browser.find_element(By.XPATH, '//*[@id="kw"]').send_keys('吐槽大会') # 通过搜索 页面中 链接进行定位 # browser.find_element_by_link_text("新闻").click() #通过搜索 页面中 链接进行定位 ,可以支持模糊匹配 # browser.find_element_by_partial_link_text("新").click() # browser.find_element_by_partial_link_text("闻").click() finally: browser.find_element_by_id("su").click() time.time(3) browser.close() # 关闭浏览器browser.quit()

四、等待元素被加载

1、selenium只是模拟浏览器的行为,而浏览器解析页面是需要时间的(执行css,js),一些元素可能需要过一段时间才能加载出来,为了保证能查找到元素,必须等待

2、等待的方式分两种

wait=WebDriverWait(browser,10) #显式等待 wait1=browser.implicitly_wait(10) #隐式等待 wait.until(EC.presence_of_element_located((By.CLASS_NAME,'tH0'))) test = wait.until(lambda x: x.find_element_by_xpath('xpath')) ''' 显式等待:指定等待某个标签加载完毕 隐式等待:等待所有标签加载完毕 '''

五、元素交互操作

ActionChains

用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况(如:iframe标签),比如单击、双击、点击鼠标右键、拖拽(滑动验证)等。而selenium给我们提供了一个类来处理这类事件——ActionChains

#iframe标签切换 #如果网页页面嵌套frame标签,子页面访问不到父页面的内容,父页面也访问不到子页面的内容所以需要切换; from selenium import webdriver from selenium.webdriver import ActionChains #鼠标键盘动作链 from selenium.webdriver.common.by import By # 按照什么方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys # 键盘按键操作 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait # 等待页面加载某些元素 import time browser=webdriver.Chrome() wait1=WebDriverWait(browser,10) browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') browser.switch_to.frame('iframeResult')#切换到id='iframewrapper'的iframe子标签 action_chains=ActionChains(browser) #实例化1个动作链队列 source=browser.find_element_by_id('draggable') #找到拖拽的源标签 target=browser.find_element_by_id('droppable')#找到拖拽的目标标签 action_chains.drag_and_drop(source,target).perform()#把动作放到动作链中,perform()准备串行执行; ''' click(on_element=None) ——单击鼠标左键 click_and_hold(on_element=None) ——点击鼠标左键,不松开 context_click(on_element=None) ——点击鼠标右键 double_click(on_element=None) ——双击鼠标左键 drag_and_drop(source, target) ——拖拽到某个元素然后松开 drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开 key_down(value, element=None) ——按下某个键盘上的键 key_up(value, element=None) ——松开某个键 move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标 move_to_element(to_element) ——鼠标移动到某个元素 move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置 perform() ——执行链中的所有动作 release(on_element=None) ——在某个元素位置松开鼠标左键 send_keys(*keys_to_send) ——发送某个键到当前焦点的元素 send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素 ''' time.sleep(5) browser.quit() 关于ActionChains参看:http://blog.csdn.net/huilan_same/article/details/52305176

1.点击,清空

import time from selenium import webdriver#驱动浏览器 from selenium.webdriver import ActionChains #滑动 from selenium.webdriver.common.by import By #选择器 from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #键盘按键操作 from selenium.webdriver.support import expected_conditions as EC #等待所有标签加载完毕 from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素 browser=webdriver.Chrome() #调用Chrome 驱动,生成浏览器对象 wait=WebDriverWait(browser,10) #设置selenium等待浏览器加载完毕的最大等待时间 browser.get('https://www.baidu.com/') browser.find_element(By.ID,'kw').send_keys("美女") browser.find_element_by_id("su").click()#点击按钮 time.sleep(4) browser.find_element(By.ID,'kw').clear()#清空input标签中的内容,让重新输入 browser.find_element_by_id('kw').send_keys('性感') browser.find_element_by_id("su").click() #点击按钮

2.前进和后退

import time from selenium import webdriver#驱动浏览器 from selenium.webdriver import ActionChains #滑动 from selenium.webdriver.common.by import By #选择器 from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #键盘按键操作 from selenium.webdriver.support import expected_conditions as EC #等待所有标签加载完毕 from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素 import time from selenium import webdriver browser=webdriver.Chrome() browser.get('http://www.cnblogs.com/sss4/') browser.find_element_by_partial_link_text( 'PythonWEB框架之Flask').click() time.sleep(3) browser.back() #后退 time.sleep(3) browser.forward() #前进 time.sleep(5) browser.close()

3.cokies相关

import time from selenium import webdriver#驱动浏览器 from selenium.webdriver import ActionChains #滑动 from selenium.webdriver.common.by import By #选择器 from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #键盘按键操作 from selenium.webdriver.support import expected_conditions as EC #等待所有标签加载完毕 from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素 from selenium import webdriver browser=webdriver.Chrome() browser.get('https://www.zhihu.com/explore') print(browser.get_cookies()) #获取cokies信息 browser.add_cookie({'k1':'xxx','k2':'yyy'}) #添加cokies信息 print(browser.get_cookies()) browser.delete_all_cookies() #删除cokies信息,慎用

4.选项卡管理

from selenium import webdriver browser=webdriver.Chrome() browser.execute_script('window.open()') #打开选项卡 browser.execute_script('window.open()') print(browser.window_handles) #获取所有的选项卡 browser.switch_to_window(browser.window_handles[0]) #切换至选项卡0 browser.get('https://www.taobao.com') browser.switch_to_window(browser.window_handles[1]) #切换至选项卡1 browser.get('https://www.baidu.com') browser.switch_to_window(browser.window_handles[2]) #切换至选项卡2 browser.get('https://v.qq.com/')

5.selenium异常处理

from selenium import webdriver from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException try: browser=webdriver.Chrome() browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') browser.switch_to.frame('iframssseResult') except TimeoutException as e: print(e) except NoSuchFrameException as e: print(e) finally: browser.close()

6. 获取元素属性

//获取a连接的href属性值 browser.find_element_by_xpath('//a')).get_attribute('href')

7. 切换窗口

定位iframe # 1.有id,并且唯一,直接写id driver.switch_to_frame("x-URS-iframe") driver.switch_to.frame("x-URS-iframe") # 2.有name,并且唯一,直接写name driver.switch_to_frame("xxxx") driver.switch_to.frame("xxxx") # 3.无id,无name,先定位iframe元素 iframe = driver.find_elements_by_tag_name("iframe")[0] driver.switch_to_frame(iframe) driver.switch_to.frame(iframe) # 4.从frame中切回主文档(switch_to.default_content()) 切到frame中之后,我们便不能继续操作主文档的元素,这时如果想操作主文档内容,则需切回主文档。 driver.switch_to.default_content()

8.获取cookie

#获取cookie cookie = browser.get_cookies() #获取到的是一个坑爹的list,没错,是个list,所用下面的代码可以转成request使用的cookiejar cookie_jar = requests.cookies.RequestsCookieJar() for item in cookie: cookie_jar.set(item["name"], item["value"], path='/', domain=item["domain"]) print("cookie处理后---->", cookie_jar)

笔者创建了一个测试交流群,如果对软件测试、接口测试、自动化测试、面试经验交流感兴趣可以加测试交流群(文章开头图片),还会有同行一起技术交流。

目录
相关文章
|
10天前
|
测试技术 C语言
网站压力测试工具Siege图文详解
网站压力测试工具Siege图文详解
19 0
|
11天前
|
敏捷开发
【sgCreatePinyin】自定义小工具:敏捷开发→自动化生成拼音字段名称(字段名生成工具)
【sgCreatePinyin】自定义小工具:敏捷开发→自动化生成拼音字段名称(字段名生成工具)
|
13天前
|
前端开发 Java 测试技术
《手把手教你》系列技巧篇(十二)-java+ selenium自动化测试-元素定位大法之By link text(详细教程)
【4月更文挑战第4天】本文介绍了link text在自动化测试中的应用。Link text是指网页中链接的文字描述,点击可跳转至其他页面。文章列举了8种常用的定位方法,其中着重讲解了link text定位,并通过实例展示了如何使用Java代码实现点击百度首页的“奥运奖牌榜 最新排名”链接,进入相应页面。如果link text不准确,则无法定位到元素,这说明linkText是精准匹配,而非模糊匹配。文章还提到了partial link text作为link text的模糊匹配版本,将在后续内容中介绍。
35 4
|
11天前
|
XML 前端开发 Java
《手把手教你》系列技巧篇(十四)-java+ selenium自动化测试-元素定位大法之By xpath上卷(详细教程)
【4月更文挑战第6天】按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath。xpath 的定位方法, 非常强大。使用这种方法几乎可以定位到页面上的任意元素。xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们可以使用Xpath 的用法来定位页面元素。XPath 是XML 和Path的缩写,主要用于xml文档中选择文档中节点。基于XML树状文档结构,XPath语言可以用在整棵树中寻找指定的节点。
42 0
|
2天前
|
Java 测试技术 定位技术
《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)
【4月更文挑战第15天】本文介绍了如何使用Selenium进行浏览器窗口切换以操作不同页面元素。首先,获取浏览器窗口句柄有两种方法:获取所有窗口句柄的集合和获取当前窗口句柄。然后,通过`switchTo().window()`方法切换到目标窗口句柄。在项目实战部分,给出了一个示例,展示了在百度首页、新闻页面和地图页面之间切换并输入文字的操作。最后,文章还探讨了在某些情况下可能出现的问题,并提供了一个简单的本地HTML页面示例来演示窗口切换的正确操作。
24 0
|
3天前
|
敏捷开发 监控 前端开发
深入理解自动化测试框架Selenium的架构与实践
【4月更文挑战第16天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加快迭代速度的关键手段。Selenium作为一种广泛使用的自动化测试工具,其开源、跨平台的特性使得它成为业界的首选之一。本文旨在剖析Selenium的核心架构,并结合实际案例探讨其在复杂Web应用测试中的高效实践方法。通过详细解读Selenium组件间的交互机制以及如何优化测试脚本,我们希望为读者提供深入理解Selenium并有效运用于日常测试工作的参考。
11 1
|
4天前
|
自然语言处理 测试技术 API
深入理解自动化测试框架Selenium的设计理念与实践
【4月更文挑战第15天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加速迭代的关键手段。Selenium作为一种广泛使用的自动化测试框架,提供了对多种浏览器和平台的支持,极大地促进了Web应用的功能测试。本文旨在剖析Selenium的核心设计理念,探讨其在实际项目中的应用,并指出常见的误区及最佳实践,以期帮助测试工程师更高效地利用Selenium进行测试工作。
|
5天前
|
监控 测试技术 API
深入理解自动化测试框架Selenium的设计与实现
【4月更文挑战第14天】在软件开发过程中,自动化测试是确保代码质量、减少人工重复劳动的关键步骤。Selenium作为一款广泛使用的自动化测试工具,提供了对多种浏览器和操作系统的支持。本文将探讨Selenium的核心组件及其架构设计,分析其如何通过WebDriver与浏览器交互,以及它如何支持多种编程语言进行脚本编写。同时,我们还将讨论Selenium Grid的作用以及它如何实现并行测试,以缩短测试周期并提高测试效率。
169 58
|
6天前
|
前端开发 JavaScript Java
《手把手教你》系列技巧篇(十九)-java+ selenium自动化测试-元素定位大法之By css下卷(详细教程)
【4月更文挑战第11天】按计划今天宏哥继续讲解css的定位元素的方法。但是今天最后一种宏哥介绍给大家,了解就可以了,因为实际中很少用。
27 2
|
6天前
|
Web App开发 测试技术 网络安全

热门文章

最新文章