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()

 

posted @ 2021-12-01 17:10  Cyyy-  阅读(676)  评论(0)    收藏  举报