UI自动化测试(selenium元素定位实战)
自动化测试
1.定义:可以理解为通过一定的技术手段,操作机器来得到人的模拟操作
2.目的:&意义:随着产品的完善,需要回顾验证的测试点越来越多,这个时候我们可以通过自动化测试的技术的手段,把需要回归的测试点中,可以使用自动化测试实现的部分实现,那么这样,我们需要回归测试的点就会减少,已实现的部分可以一劳永逸。
3.分类:
-
UI自动化测试:(前端自动化测试)--->selenium(工具&框架&库)
-
API自动化测试
-
单元自动化测试
一、selenium环境搭建
环境搭建步骤:
1、在终端输入安装selenium的第三方的库的命令:pip3 install selenium
2、安装chrome的浏览器
3、下载浏览器对应的驱动程序(driver):http://npm.taobao.org/mirrors/chromedriver/
先查看浏览器的版本:浏览器--设置--关于
4.打开下载驱动的连接,下载与之相匹配的driver版本:(没有55也可以下45)

4、然后把chromedriver放到python的bin目录下:
找到python的路径:
>>> import sys
>>> for item in sys.path:
... print(item)
...
/Library/Frameworks/Python.framework/Versions/3.10/lib/python310.zip
/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10
/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/lib-dynload
/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages
>>>
输入 open /Library/Frameworks/Python.framework/Versions/3.10/
打开python的bin目录,将解压后的包拖进来
5.终端输入chromedriver验证是否安装成功

二、单个元素定位方法8种
1.通过id(打开chrome浏览器,打开百度,右击点击检查打开开发者模式)
搜索框输入的元素
百度一下的元素
from selenium import webdriver
import time as t
#指定被测的浏览器并且对webdriver进行实例化
driver=webdriver.Chrome()
#导航到被测的网址
driver.get('http://www.baidu.com/')
#等待三秒
t.sleep(3)
driver.find_element_by_id('kw').send_keys('彭于晏')
t.sleep(3)
driver.find_element_by_id('su').click()
t.sleep(5)
#退出
driver.quit()
2.通过name
from selenium import webdriver
import time as t
#指定被测的浏览器并且对webdriver进行实例化
driver=webdriver.Chrome()
#导航到被测的网址
driver.get('http://www.baidu.com/')
#等待三秒
t.sleep(3)
driver.find_element_by_name('wd').send_keys('彭于晏')
t.sleep(3)
driver.find_element_by_id('su').click() #百度一下没有name
t.sleep(5)
#退出
driver.quit()
3.通过class name
from selenium import webdriver import time as t #指定被测的浏览器并且对webdriver进行实例化 driver=webdriver.Chrome() #导航到被测的网址 driver.get('http://www.baidu.com/') #等待三秒 t.sleep(3) driver.find_element_by_class_name('s_ipt').send_keys('彭于晏') t.sleep(3) driver.find_element_by_class_name('btn self-btn bg s_btn').click() t.sleep(5) #出现空格和数字都不能执行 #退出 driver.quit()
执行后会结果如下:
/Applications/code/testdev/UI自动化测试/index.py:17: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead driver.find_element_by_class_name('s_ipt').send_keys('彭于晏') /Applications/code/testdev/UI自动化测试/index.py:19: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead driver.find_element_by_class_name('btn self-btn bg s_btn').click() Traceback (most recent call last): File "/Applications/code/testdev/UI自动化测试/index.py", line 19, in <module> driver.find_element_by_class_name('btn self-btn bg s_btn').click() File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 754, in find_element_by_class_name return self.find_element(by=By.CLASS_NAME, value=name) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 1238, in find_element return self.execute(Command.FIND_ELEMENT, { File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 418, in execute self.error_handler.check_response(response) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py", line 243, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".btn self-btn bg s_btn"} (Session info: chrome=96.0.4664.55) Stacktrace: 0 chromedriver 0x00000001049ffd48 __gxx_personality_v0 + 548124 1 chromedriver 0x00000001049947a0 __gxx_personality_v0 + 108404 2 chromedriver 0x0000000104592b94 chromedriver + 158612 3 chromedriver 0x00000001045c2704 chromedriver + 354052 4 chromedriver 0x00000001045eb9f0 chromedriver + 522736 5 chromedriver 0x00000001045b76a0 chromedriver + 308896 6 chromedriver 0x00000001049c2920 __gxx_personality_v0 + 297204 7 chromedriver 0x00000001049d6924 __gxx_personality_v0 + 379128 8 chromedriver 0x00000001049db798 __gxx_personality_v0 + 399212 9 chromedriver 0x00000001049d77c8 __gxx_personality_v0 + 382876 10 chromedriver 0x00000001049b83f0 __gxx_personality_v0 + 254916 11 chromedriver 0x00000001049f0f78 __gxx_personality_v0 + 487244 12 chromedriver 0x00000001049f10ec __gxx_personality_v0 + 487616 13 chromedriver 0x0000000104a06920 __gxx_personality_v0 + 575732 14 libsystem_pthread.dylib 0x000000019e82b878 _pthread_start + 320 15 libsystem_pthread.dylib 0x000000019e8265e0 thread_start + 8
4.通过xpath name classname id 找不到的情况下用xpath
from selenium import webdriver
import time as t
#指定被测的浏览器并且对webdriver进行实例化
driver=webdriver.Chrome()
#导航到被测的网址
driver.get('http://www.baidu.com/')
#等待三秒
t.sleep(3)
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('彭于晏')
t.sleep(3)
driver.find_element_by_xpath('//*[@id="su"]').click()
t.sleep(5)
#退出
driver.quit()
5.link text" 超连接
在页面的交互种如果存在超链接,可以使用的方法为find_element_by_link_text,比如在百度首先我们需要点击新闻,那么就可以使用此方法来进行定位
一般而言在a标签里面的,我们都可以理解为超链接,就可以使用该方法来进行具体的操作了,针对点击新闻的超链接测试代码为:
from selenium import webdriver
import time as t
driver=webdriver.Chrome()
driver.get('http://www.baidu.com/')
t.sleep(3)
driver.find_element_by_link_text('新闻').click() #精确点击新闻
t.sleep(5)
driver.quit()
6.partial link text" 超连接模糊匹配
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.get('http://www.baidu.com/') t.sleep(3) driver.find_element_by_partial_link_text('hao').click() t.sleep(5) driver.quit()
8.css selector
from selenium import webdriver
import time as t
#指定被测的浏览器并且对webdriver进行实例化
driver=webdriver.Chrome()
#导航到被测的网址
driver.get('http://www.baidu.com/')
#等待三秒
t.sleep(3)
driver.find_element_by_css_selector('#kw').send_keys('彭于晏')
t.sleep(3)
driver.find_element_by_css_selector('#su').click()
t.sleep(5)
#退出
driver.quit()
8.tag_name
from selenium import webdriver
import time as t
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.find_elements_by_tag_name('input').send_keys('测试开发')
t.sleep(3)
driver.quit()
执行如上代码,出错了,提示错误信息为:
/Applications/code/testdev/UI自动化测试/元素定位的方法.py:20: DeprecationWarning: find_elements_by_* commands are deprecated. Please use find_elements() instead driver.find_elements_by_tag_name('input').send_keys('测试开发') Traceback (most recent call last): File "/Applications/code/testdev/UI自动化测试/元素定位的方法.py", line 20, in <module> driver.find_elements_by_tag_name('input').send_keys('测试开发') AttributeError: 'list' object has no attribute 'send_keys'
#“list”对象没有属性“send_keys”
这是因为"input"在列表中,这时我们需要索引的方式来解决,这是单个元素定位的方式无法解决的,这时我们可以使用多个元素定位的方式来解决。
三、多个元素定位的方法8种
当元素属性的ID,name等完全一致的时候,那么这个时候,你发现无法使用单个元素定位的方式来解决,那么可以使用多个元素定位的方式来进行。
解决思路:
获取元素的属性,其实是一个列表,看我们被定位的目标属性是在第几位,那么就使用索引。
1.find_elements_by_tag_name()
比如就以百度搜索输入框为案例,我们使用的是input标签的方式进行,但是
input标签有8个,那么就不是唯一的了,具体如下所示:
针对这种不是唯一的,我们可以使用多个元素定位的方式来解决,其实多个元素定位的核心思想是获取到的元素属性是一个列表,我们可以使用列表的索引来进行定位,比如针对标签的方法就是find_elements_by_tag_name(),当然其他的方法其实都是一样的,这里我们先获取到它的属性,然后输出,就可以看到它的数据是列表,具体案例代码如下:
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.get('http://www.baidu.com/') tags=driver.find_elements_by_tag_name('input') t.sleep(3) tags[7].send_keys('彭于晏') t.sleep(3) driver.find_element_by_id('su').click() t.sleep(3) driver.quit()
2.find_elements_by_id()
再比如:这么一个简单的登录页面,我们想要进入他的输入框输入内容,但它只有id并且id都一样的情况下,我们可以根据id的索引来进入
代码如下:
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.get('file:///Applications/code/testdev/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/denglu.html') t.sleep(3) lists=driver.find_elements_by_id('user') t.sleep(3) lists[0].send_keys('admin') #进入第一个框.输入用户名 t.sleep(3) lists[1].send_keys('asd888') #进入第二个框.输入密码 t.sleep(3) lists[2].click() #点击第三个框登录 t.sleep(3) driver.quit()
四、iframe框架
iframe就是我们常用的iframe标签:<iframe>。iframe标签是框架的一种形式,也比较常用到,iframe一般用来包含别的页面,和大多HTML标签写法相同,iframe标签输入形式为:<iframe>和</iframe>。以<iframe>开头,以</iframe>结尾,将需要的文本内容添加到两个标签之间即可。
iframe框架进入的三种方式: ID name 索引
比如:我们想要登录qq邮箱
1.通过id进入,代码如下:
from selenium import webdriver
import time as t
driver=webdriver.Chrome()
driver.maximize_window()
driver.get('https://mail.qq.com/')
t.sleep(5)
#通过id进入框架
driver.switch_to.frame('login_frame')
t.sleep(10)
driver.find_element_by_id('u').send_keys('173045056@qq.com')
t.sleep(10)
driver.find_element_by_id('p').send_keys('asd888')
t.sleep(3)
driver.quit()
2.通过name的方式,代码如下:
from selenium import webdriver
import time as t
driver=webdriver.Chrome()
driver.maximize_window()
driver.get('https://mail.qq.com/')
t.sleep(5)
#通过name进入框架
driver.switch_to.frame('login_frame')#name刚好等于id
t.sleep(10)
driver.find_element_by_id('u').send_keys('1735056@qq.com')
t.sleep(10)
driver.find_element_by_id('p').send_keys('asd888')
t.sleep(3)
driver.quit()
比如想要登录163邮箱
3.通过索引的方式,代码如下:
rom selenium import webdriver
import time as t
driver=webdriver.Chrome()
driver.maximize_window()
driver.get('https://mail.163.com/')
t.sleep(5)
#通过索引进入框架
driver.switch_to.frame(0) #第一个框架,索引为0
t.sleep(10)
driver.find_element_by_name('email').send_keys('15191084297@163.com')
t.sleep(10)
driver.find_element_by_id('dologin').click()
t.sleep(3)
driver.quit()