您现在的位置是:首页 > 技术教程 正文

【Python自动化测试】详解selenium从入门到实战【一】

admin 阅读: 2024-03-26
后台-插件-广告管理-内容页头部广告(手机)

%20
目录

%20 简介

%20 selenium安装

%20 安装浏览器驱动

%20 确定浏览器版本

%20 下载驱动

%20 定位页面元素

%20 打开指定页面

%20 id%20定位

%20 name%20定位

%20 class%20定位

%20 tag%20定位

%20 xpath%20定位

%20 css%20定位

%20 link%20定位

%20 partial_link%20定位

%20 浏览器控制

%20 修改浏览器窗口大小

%20 浏览器前进&后退

%20 浏览器刷新

%20 浏览器窗口切换

%20 常见操作

%20 鼠标控制

%20 单击左键

%20 单击右键

%20 双击

%20 拖动

%20 鼠标悬停

%20 键盘控制

%20 END资源分享

%20 软件测试面试小程序

%20
简介%20

Selenium%20是最广泛使用的开源%20Web%20UI(用户界面)自动化测试套件之一。Selenium%20支持的语言包括C#,Java,Perl,PHP,Python%20和%20Ruby。目前,Selenium%20Web%20驱动程序最受%20Python%20和%20C#欢迎。%20Selenium%20测试脚本可以使用任何支持的编程语言进行编码,并且可以直接在大多数现代%20Web%20浏览器中运行。在爬虫领域%20selenium%20同样是一把利器,能够解决大部分的网页的反爬问题,但也不是万能的,它最明显的缺点就是速度慢。下面就进入正式的%20study%20阶段。

%20
selenium安装%20

打开%20cmd,输入下面命令进行安装。

%20 pip%20install%20-i%20https://pypi.douban.com/simple%20selenium %20

执行后,使用%20pip%20show%20selenium%20查看是否安装成功。

%20 安装浏览器驱动%20

针对不同的浏览器,需要安装不同的驱动。下面列举了常见的浏览器与对应的驱动程序下载链接,部分网址需要%20“科学上网”%20才能打开哦(dddd)。

%20
  • Firefox%20浏览器驱动:Firefox
  • Chrome%20浏览器驱动:Chrome
  • IE%20浏览器驱动:IE
  • Edge%20浏览器驱动:Edge
  • PhantomJS%20浏览器驱动:PhantomJS
  • Opera%20浏览器驱动:Opera

这里以安装%20Chrome%20驱动作为演示。但%20Chrome%20在用%20selenium%20进行自动化测试时还是有部分%20bug%20,常规使用没什么问题,但如果出现一些很少见的报错,可以使用%20Firefox%20进行尝试,毕竟是%20selenium%20官方推荐使用的。

%20 确定浏览器版本%20

在新标签页输入%20chrome://settings/%20进入设置界面,然后选择%20【关于%20Chrome

%20

查看自己的版本信息。这里我的版本是94,这样在下载对应版本的%20Chrome%20驱动即可。

%20

%20 下载驱动%20

打开%20Chrome驱动%20。单击对应的版本。

%20

%20

根据自己的操作系统,选择下载。

%20

%20

下载完成后,压缩包内只有一个%20exe%20文件。%20将%20chromedriver.exe%20保存到任意位置,并把当前路径保存到环境变量中(我的电脑>>右键属性>>高级系统设置>>高级>>环境变量>>系统变量>>Path),添加的时候要注意不要把%20path%20变量给覆盖了,如果覆盖了千万别关机,然后百度。添加成功后使用下面代码进行测试。

%20
  1. from%20selenium%20import%20webdriver
  2. %20
  3. #%20Chrome浏览器
  4. driver%20=%20webdriver.Chrome()
%20

%20 定位页面元素%20 打开指定页面%20

使用%20selenium%20定位页面元素的前提是你已经了解基本的页面布局及各种标签含义,当然如果之前没有接触过,现在我也可以带你简单的了解一下。%20以我们熟知的%20CSDN%20为例,我们进入首页,按%20【F12】%20进入开发者工具。红框中显示的就是页面的代码,我们要做的就是从代码中定位获取我们需要的元素。

%20

%20

想要定位并获取页面中的信息,首先要使用%20webdriver%20打开指定页面,再去定位。

%20 %20
  1. from%20selenium%20import%20webdriver
  2. %20
  3. #%20Chrome浏览器
  4. driver%20=%20webdriver.Chrome()
  5. driver.get('https://www.csdn.net/')
%20

执行上面语句后会发现,浏览器打开%20CSDN%20主页后会马上关闭,想要防止浏览器自动关闭,可以添加下面代码。

%20 %20
  1. #%20不自动关闭浏览器
  2. option%20=%20webdriver.ChromeOptions()
  3. option.add_experimental_option("detach",%20True)
  4. %20
  5. #%20将option作为参数添加到Chrome中
  6. driver%20=%20webdriver.Chrome(chrome_options=option)
%20

这样将上面的代码组合再打开浏览器就不会自动关闭了。

%20 %20
  1. from%20selenium%20import%20webdriver
  2. %20
  3. #%20不自动关闭浏览器
  4. option%20=%20webdriver.ChromeOptions()
  5. option.add_experimental_option("detach",%20True)
  6. %20
  7. #%20注意此处添加了chrome_options参数
  8. driver%20=%20webdriver.Chrome(chrome_options=option)
  9. driver.get('https://www.csdn.net/')
%20

下面我们再来看看几种常见的页面元素定位方式。

%20 id%20定位%20

标签的%20id%20具有唯一性,就像人的身份证,假设有个%20input%20标签如下。

%20 <input%20id="toolbar-search-input"%20autocomplete="off"%20type="text"%20value=""%20placeholder="C++难在哪里?"> %20

我们可以通过%20id%20定位到它,由于%20id%20的唯一性,我们可以不用管其他的标签的内容。

%20 driver.find_element_by_id("toolbar-search-input") %20 name%20定位%20

name%20指定标签的名称,在页面中可以不唯一。假设有个%20meta%20标签如下

%20 <meta%20name="keywords"%20content="CSDN博客,CSDN学院,CSDN论坛,CSDN直播"> %20

我们可以使用%20find_element_by_name%20定位到%20meta%20标签。

%20 driver.find_element_by_name("keywords") %20 class%20定位%20

class%20指定标签的类名,在页面中可以不唯一。假设有个%20div%20标签如下

%20 <div%20class="toolbar-search-container"> %20

我们可以使用%20find_element_by_class_name%20定位到%20div%20标签。

%20 driver.find_element_by_class_name("toolbar-search-container") %20 tag%20定位%20

每个%20tag%20往往用来定义一类功能,所以通过%20tag%20来识别某个元素的成功率很低,每个页面一般都用很多相同的%20tag%20,比如:\、\%20 <div%20class="toolbar-search-container"> %20

我们可以使用%20find_element_by_class_name%20定位到%20div%20标签。

%20 driver.find_element_by_tag_name("div") %20 xpath%20定位%20

xpath%20是一种在%20XML%20文档中定位元素的语言,它拥有多种定位方式,下面通过实例我们看一下它的几种使用方式。

%20
  1. <html>
  2. %20%20<head>...<head/>
  3. %20%20<body>
  4. %20%20%20%20<div%20id="csdn-toolbar">
  5. %20%20%20%20%20%20<div%20class="toolbar-inside">
  6. %20%20%20%20%20%20%20%20<div%20class="toolbar-container">
  7. %20%20%20%20%20%20%20%20%20%20<div%20class="toolbar-container-left">...</div>
  8. %20%20%20%20%20%20%20%20%20%20<div%20class="toolbar-container-middle">
  9. %20%20%20%20%20%20%20%20%20%20%20%20<div%20class="toolbar-search%20onlySearch">
  10. <div%20class="toolbar-search-container">
  11. <input%20id="toolbar-search-input"%20autocomplete="off"%20type="text"%20value=""%20placeholder="C++难在哪里?">
%20

根据上面的标签需要定位%20最后一行%20input%20标签,以下列出了四种方式,xpath%20定位的方式多样并不唯一,使用时根据情况进行解析即可。

%20
  1. #%20绝对路径(层级关系)定位
  2. driver.find_element_by_xpath(
  3. "/html/body/div/div/div/div[2]/div/div/input[1]")
  4. #%20利用元素属性定位
  5. driver.find_element_by_xpath(
  6. "//*[@id='toolbar-search-input']"))
  7. #%20层级+元素属性定位
  8. driver.find_element_by_xpath(
  9. "//div[@id='csdn-toolbar']/div/div/div[2]/div/div/input[1]")
  10. #%20逻辑运算符定位
  11. driver.find_element_by_xpath(
  12. "//*[@id='toolbar-search-input'%20and%20@autocomplete='off']")
%20 css%20定位%20

CSS%20使用选择器来为页面元素绑定属性,它可以较为灵活的选择控件的任意属性,一般定位速度比%20xpath%20要快,但使用起来略有难度。%20CSS%20选择器常见语法:

%20
方法例子描述
.class.toolbar-search-container选择%20class%20=%20'toolbar-search-container'%20的所有元素
#id#toolbar-search-input选择%20id%20=%20'toolbar-search-input'%20的元素
**选择所有元素
elementinput选择所有%20
element>elementdiv>input选择父元素为%20%20的所有%20
element+elementdiv+input选择同一级中在%20%20之后的所有%20
[attribute=value]type='text'选择%20type%20=%20'text'%20的所有元素
%20

举个简单的例子,同样定位上面实例中的%20input%20标签。

%20
  1. driver.find_element_by_css_selector('#toolbar-search-input')
  2. driver.find_element_by_css_selector('html>body>div>div>div>div>div>div>input')
%20 link%20定位%20

link%20专门用来定位文本链接,假如要定位下面这一标签。

%20 <div%20class="practice-box"%20data-v-04f46969="">加入!每日一练</div> %20

我们使用%20find_element_by_link_text%20并指明标签内全部文本即可定位。

%20 driver.find_element_by_link_text("加入!每日一练") %20 partial_link%20定位%20

partial_link%20翻译过来就是“部分链接”,对于有些文本很长,这时候就可以只指定部分文本即可定位,同样使用刚才的例子。

%20 <div%20class="practice-box"%20data-v-04f46969="">加入!每日一练</div> %20

我们使用%20find_element_by_partial_link_text%20并指明标签内部分文本进行定位。

%20 driver.find_element_by_partial_link_text("加入") %20

%20 浏览器控制%20 修改浏览器窗口大小%20

webdriver%20提供%20set_window_size()%20方法来修改浏览器窗口的大小。

%20
  1. from%20selenium%20import%20webdriver
  2. %20
  3. #%20Chrome浏览器
  4. driver%20=%20webdriver.Chrome()
  5. driver.get('https://www.csdn.net/')
  6. #%20设置浏览器浏览器的宽高为:600x800
  7. driver.set_window_size(600,%20800)
%20

也可以使用%20maximize_window()%20方法可以实现浏览器全屏显示。

%20
  1. from%20selenium%20import%20webdriver
  2. %20
  3. #%20Chrome浏览器
  4. driver%20=%20webdriver.Chrome()
  5. driver.get('https://www.csdn.net/')
  6. #%20设置浏览器浏览器的宽高为:600x800
  7. driver.maximize_window()
%20 浏览器前进&后退%20

webdriver%20提供%20back%20和%20forward%20方法来实现页面的后退与前进。下面我们%20①进入CSDN首页,②打开CSDN个人主页,③back%20返回到CSDN首页,④%20forward%20前进到个人主页。

%20
  1. from%20selenium%20import%20webdriver
  2. from%20time%20import%20sleep
  3. %20
  4. driver%20=%20webdriver.Chrome()
  5. %20
  6. #%20访问CSDN首页
  7. driver.get('https://www.csdn.net/')
  8. sleep(2)
  9. #访问CSDN个人主页
  10. driver.get('https://blog.csdn.net/qq_43965708')
  11. sleep(2)
  12. #返回(后退)到CSDN首页
  13. driver.back()
  14. sleep(2)
  15. #前进到个人主页
  16. driver.forward()

细心的读者会发现第二次 get() 打开新页面时,会在原来的页面打开,而不是在新标签中打开。如果想的话也可以在新的标签页中打开新的链接,但需要更改一下代码,执行 js 语句来打开新的标签。

  1. # 在原页面打开
  2. driver.get('https://blog.csdn.net/qq_43965708')
  3. # 新标签中打开
  4. js = "window.open('https://blog.csdn.net/qq_43965708')"
  5. driver.execute_script(js)

浏览器刷新

在一些特殊情况下我们可能需要刷新页面来获取最新的页面数据,这时我们可以使用 refresh() 来刷新当前页面。

  1. # 刷新页面
  2. driver.refresh()

浏览器窗口切换

在很多时候我们都需要用到窗口切换,比如:当我们点击注册按钮时,它一般会打开一个新的标签页,但实际上代码并没有切换到最新页面中,这时你如果要定位注册页面的标签就会发现定位不到,这时就需要将实际窗口切换到最新打开的那个窗口。我们先获取当前各个窗口的句柄,这些信息的保存顺序是按照时间来的,最新打开的窗口放在数组的末尾,这时我们就可以定位到最新打开的那个窗口了。

  1. # 获取打开的多个窗口句柄
  2. windows = driver.window_handles
  3. # 切换到当前最新打开的窗口
  4. driver.switch_to.window(windows[-1])

常见操作

webdriver中的常见操作有:

方法描述
send_keys()模拟输入指定内容
clear()清除文本内容
is_displayed()判断该元素是否可见
get_attribute()获取标签属性值
size返回元素的尺寸
text返回元素文本

接下来还是用 CSDN 首页为例,需要用到的就是搜素框和搜索按钮。通过下面的例子就可以气息的了解各个操作的用法了。

%20
  1. from%20selenium%20import%20webdriver
  2. %20
  3. driver%20=%20webdriver.Chrome()
  4. %20
  5. driver.get('https://www.csdn.net/')
  6. sleep(2)
  7. #%20定位搜索输入框
  8. text_label%20=%20driver.find_element_by_xpath('//*[@id="toolbar-search-input"]')
  9. %20
  10. #%20在搜索框中输入%20Dream丶Killer
  11. text_label.send_keys('Dream丶Killer')
  12. %20
  13. sleep(2)
  14. #%20清除搜索框中的内容
  15. text_label.clear()
  16. %20
  17. #%20输出搜索框元素是否可见
  18. print(text_label.is_displayed())
  19. #%20输出placeholder的值
  20. print(text_label.get_attribute('placeholder'))
  21. %20
  22. #%20定位搜索按钮
  23. button%20=%20driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
  24. #%20输出按钮的大小
  25. print(button.size)
  26. #%20输出按钮上的文本
  27. print(button.text)
  28. %20
  29. '''输出内容
  30. True
  31. python面试100问
  32. {'height':%2032,%20'width':%2028}
  33. 搜索
  34. '''

%20

%20 鼠标控制%20

在webdriver%20中,鼠标操作都封装在ActionChains类中,常见方法如下:

%20
方法描述
click()单击左键
context_click()单击右键
double_click()双击
drag_and_drop()拖动
move_to_element()鼠标悬停
perform()执行所有ActionChains中存储的动作
%20 单击左键%20

模拟完成单击鼠标左键的操作,一般点击进入子页面等会用到,左键不需要用到%20ActionChains%20。

%20 %20
  1. #%20定位搜索按钮
  2. button%20=%20driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
  3. #%20执行单击操作
  4. button.click()
%20 单击右键%20

鼠标右击的操作与左击有很大不同,需要使用%20ActionChains%20。

%20 %20
  1. from%20selenium.webdriver.common.action_chains%20import%20ActionChains
  2. %20
  3. #%20定位搜索按钮
  4. button%20=%20driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
  5. #%20右键搜索按钮
  6. ActionChains(driver).context_click(button).perform()
%20 双击%20

模拟鼠标双击操作。

%20 %20
  1. #%20定位搜索按钮
  2. button%20=%20driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
  3. #%20执行双击动作
  4. ActionChains(driver).double_click(button).perform()
%20 拖动%20

模拟鼠标拖动操作,该操作有两个必要参数,

%20
  • source:鼠标拖动的元素
  • target:鼠标拖至并释放的目标元素
%20
  1. #%20定位要拖动的元素
  2. source%20=%20driver.find_element_by_xpath('xxx')
  3. #%20定位目标元素
  4. target%20=%20driver.find_element_by_xpath('xxx')
  5. #%20执行拖动动作
  6. ActionChains(driver).drag_and_drop(source,%20target).perform()
%20 鼠标悬停%20

模拟悬停的作用一般是为了显示隐藏的下拉框,比如%20CSDN%20主页的收藏栏,我们看一下效果。

%20

%20 %20
  1. #%20定位收藏栏
  2. collect%20%20=%20driver.find_element_by_xpath('//*[@id="csdn-toolbar"]/div/div/div[3]/div/div[3]/a')
  3. %20
  4. #%20悬停至收藏标签处
  5. ActionChains(driver).move_to_element(collect).perform()
%20

%20 键盘控制%20

webdriver%20中%20Keys%20类几乎提供了键盘上的所有按键方法,我们可以使用%20send_keys%20+%20Keys%20实现输出键盘上的组合按键如%20“Ctrl%20+%20C”、“Ctrl%20+%20V”%20等。

%20 %20
  1. from%20selenium.webdriver.common.keys%20import%20Keys
  2. %20
  3. #%20定位输入框并输入文本
  4. driver.find_element_by_id('xxx').send_keys('Dream丶killer')
  5. %20
  6. #%20模拟回车键进行跳转(输入内容后)%20
  7. driver.find_element_by_id('xxx').send_keys(Keys.ENTER)
  8. %20
  9. #%20使用%20Backspace%20来删除一个字符
  10. driver.find_element_by_id('xxx').send_keys(Keys.BACK_SPACE)
  11. %20
  12. #%20Ctrl%20+%20A%20全选输入框中内容
  13. driver.find_element_by_id('xxx').send_keys(Keys.CONTROL,%20'a')
  14. %20
  15. #%20Ctrl%20+%20C%20复制输入框中内容
  16. driver.find_element_by_id('xxx').send_keys(Keys.CONTROL,%20'c')
  17. %20
  18. #%20Ctrl%20+%20V%20粘贴输入框中内容
  19. driver.find_element_by_id('xxx').send_keys(Keys.CONTROL,%20'v')

其他常见键盘操作:

操作描述
Keys.F1F1键
Keys.SPACE空格
Keys.TABTab键
Keys.ESCAPEESC键
Keys.ALTAlt键
Keys.SHIFTShift键
Keys.ARROW_DOWN向下箭头
Keys.ARROW_LEFT向左箭头
Keys.ARROW_RIGHT向右箭头
Keys.ARROW_UP向上箭头

END资源分享

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!回馈铁杆粉丝们,朋友们如果需要可以自行免费领取 【保证100%免费】

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

全套资料获取方式 :

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索