Python自动化测试面试题及答案(持续更新中)

1、自动化代码中,用到了哪些设计模式?单例设计模式工厂模式PO设计模式数据驱动模式面向接口编程设计模式2、什么是断言(Assert)?断言Assert用于在代码中验证实际结果是不是符合预期结果,如果测试用例执行失败会抛出异常并提供断言日志3、什么是web自动化测试Web自动化测试是从UI(用户界面)层面进行的自动化测试测试人员通过编程自动化程序(测试用例脚本)来打开浏览器测试网站的业务逻辑4、什么是seleniumSelenium是一个开源的web自动化测试框架,支持

大家好,又见面了,我是你们的朋友全栈君。

https://www.cnblogs.com/ITester520/p/13477226.html

1、自动化代码中,用到了哪些设计模式?

  1. 单例设计模式
  2. 工厂模式
  3. PO设计模式
  4. 数据驱动模式
  5. 面向接口编程设计模式

2、什么是断言(Assert)?

  • 断言Assert用于在代码中验证实际结果是不是符合预期结果,
  • 如果测试用例执行失败会抛出异常并提供断言日志

3、什么是web自动化测试

  • Web自动化测试是从UI (用户界面)层面进行的自动化测试
  • 测试人员通过编程自动化程序(测试用例脚本)来打开浏览器测试网站的业务逻辑

4、什么是selenium

Selenium是一个开源的web自动化测试框架,支持多种编程语言开发自动化测试脚本,支持跨浏览器平台进行测试

5、出Selenium中你最熟悉的接口或类

WebDriver、InternetExplorerDriver、 FirefoxDriver、 ChromeDriver、 WebElement、WebDriverWait、 By

6、元素定位类型有哪些?

元素定位的方法一共有8种方式:

  • id定位: find_element_by_id()
  • name定位: find_element_by_name()
  • class定位:find_element_by_class_name()
  • tag定位:find_element_by_tag_name()
  • link定位:find_element_by_link_text()
  • partial_link定位:find_element_by_partial_link_text()
  • xpath定位:find_element_by_xpath()
  • CSS定位:find_element_by_css_selector()

By类一共有8种元素定位方式,它们都是静态方法:

  • By.id():
  • By.name():
  • By.tagName():
  • By.className():
  • By.cssSelector():
  • By linkText():
  • By partialLinkText():
  • By.xpath():

7、Xpath是什么?

  • 它是查找web页面元素的一种方式,相当于元素在dom中间的一个路径,可以采用绝对路径和相对路径的方式进行定位
  • 它对于定义动态的页面元素有很大的帮助,同时也需要谨慎使用,因为如果页面结构发生变化,那么定位信息也可能需要变化。

8、findElement()和findElements(方法有什么区别

两个都是查找页面元素的方法:

  • findElement():查找一个页面元素,只会返回一个WebElement对象
  • findElements() :查找页面上所有符合匹配的元素,返回元素集合

9、登录按钮除了用click方法进行点击以外还有其他方式吗?

还可以使用submit()方法,前提是input元素的type为submit

10、怎么提高Selenium脚本的执行速度

  • 优化等待时间:使用 WebDriverWait 智能等待来代替线程等待 sleep 和 隐式等待 implicityWait
  • 减少不必要的操作:如直接进入某页面代替经过一系列自动化操作进入某页面在服务器允许的情况下,使用多线程实现并发执行测试用例

11、怎么对含有验证码的功能进行自动化测试

  • 图像识别,技术难度大,效果不佳,不推荐
  • 屏蔽验证码,邀请开发处理,但在预生产环境或者生产环境不推荐
  • 万能验证码,使用一个复杂的其他人无法猜到的验证码

12、怎么验证复选按钮是不是被选中

可以使用元素的 isSelected() 方法,如果返回的是 true 则说明被选中,否则表明未被选中

13、如何处理alert弹窗?

  • 处理alert弹窗首先需要跳转到alert上,然后再点击确定或者取消按钮
  • Alert alert = driver.switchTo().alert(); //切换到alert
  • alert.accept0; //确定
  • alert.dismiss0; //取消

14、下拉菜单中如何去选择一个菜单项?

  • 如果下拉菜单是select标签,使用: selectByValue() 或者 selectByIndex() 或者 selectByVisibleText() 即可
  • 如果这个下拉菜单不是通过 select 标签创建,则直接通过 xpath 定位元素然后去点击选择

15、如何模拟浏览器的前进和后退、刷新操作

  • driver.back() 后退
  • driver.forward() 前进
  • driver.refresh() 刷新

16、怎么获得当前页面的URL?

String url = driver.getCurrentUrl();

17、WebDriver的close()和quit()方法的区别是什么?

  • quit()是关闭浏览器,并且关闭进程
  • close()关闭当前标签页,不会关闭进程

18、你觉得自动化测试用例哪些缺陷?

  • 成本比较大,而承销可能并不高
  • 适合自动化测试的功能有限
  • 某些功能操作相对复杂,比如验证码
  • 维护成本高,一旦项目需求变更,自动化测试脚本和用例就需要改进

19、web端功能自动化,如何实现上传文件

  • 第一种方式:标签是input,直接使用页面元素定位,然后发送文件路径即可
  • 第二种方式:使用autoit脚本上传方式

20、遇到 这种class中间有空格的控件,如何通过class定位?

  • xpath定位:直接//d1 [@class=“inf_bar clearfx”]
  • css定位: d1.inf_bar.clearfix

21、selenium自动化,遇到iframe如何处理?

使用switch_to.frame切换进iframe当中后,再去定位其中的元素操作

22、Web端功能自动化中,如何切换句柄。

先获取所有窗口句柄,然后使用 switch_ to.window() 切换到指定窗口

23、测试中遇到 readonly 属性的控件,需要如何处理?简述一下思路

先修改关闭readonly 属性,然后再操作元素

24、需求:给定一个只包含正整数且非空的数组,返回该数组中重复次数最多的前N个数字(返回结果按重复次数从多到少降序), 请用熟悉的语言实现该需求。

a = [1, 6, 7, 4, 4, 5, 4, 5, 4, 5, 5, 6, 7, 8, 5, 6, 7, 3, 4, 2, 2, 1, 4, 8, 9, 4, 5, 6]

def get_datas(a):
    result = []
    data_dict = { 
   }
    # 键值对:键:数字,值:在列表中的次数
    for item in set(a):
        data_dict[str(item)] = a.count(item)
    print(data_dict)
    # 将键值对按值(数字出现的次数)排序 ---从高到低排序
    res = sorted(data_dict.values(),reverse=True)
    print(res)
    print(data_dict.items())
    for num in res:
        for key,value in data_dict.items():
            # 如果值在列表中不存在,则添加到结果列表中
            if num == value and key not in result:
                result.append(key)

    return result

b = get_datas(a)
print(b)

执行结果:
在这里插入图片描述

25、例如: passwd={“admin’”:“123321”,“user1”:” 123456″} 满足一下条件

  • 1、设计一个登陆程序,不同的用户名和对应密码存在一个字典里面,输入正确的用户和密码去登陆
  • 2、首先输入用户名,如果用户名不存在或者为空,则一直提示输入正确的用户名
  • 3、 当用户名正确,提示去输入密码,如果密码跟用户名不对应,则提示密码错误请重新输入
  • 4、如果密码输入错误超过三次,中断程序运行。
  • 5、当输入密码错误时,提示还有几次机会
  • 6、用户名和密码都输入成功的时候, 提示登陆成功!
users = { 
   'admin':'123456','user1':'123456'}
count = 0

def login():
    global count
    username = input('请输入用户名:')
    if username == None or username == '':
        login()
    if username not in users.keys():
        print('输入的用户名不存在,请重新输入用户名:')
        login()
    while (count < 3 ):
        passwd = input('请输入密码:')
        if passwd == users[username]:
            print('登录成功!!!')
            count = 3
        else:
            count += 1
            print('密码输入错误,您还有{}次机会。'.format(3 - count))
login()

26、编写一个程序

  • 1、能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件;
  • 2、并打印出相对路径。

27、九九乘法表

for i in range(1, 10):
    for j in range(1, i+1):
        print('{}x{}={}\t'.format(j, i, i*j), end='')
    print()

在这里插入图片描述

28、斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13,特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。

# 获取用户输入数据
nterms = int(input("你需要几项?"))
 
# 第一和第二项
n1 = 0
n2 = 1
count = 2
 
# 判断输入的值是否合法
if nterms <= 0:
   print("请输入一个正整数。")
elif nterms == 1:
   print("斐波那契数列:")
   print(n1)
else:
   print("斐波那契数列:")
   print(n1,",",n2,end=" , ")
   while count < nterms:
       nth = n1 + n2
       print(nth,end=" , ")
       # 更新值
       n1 = n2
       n2 = nth
       count += 1

在这里插入图片描述

29、最大公约数

# 定义一个函数
def hcf(x, y):
   """该函数返回两个数的最大公约数"""
   # 获取最小值
   if x > y:
       smaller = y
   else:
       smaller = x
   for i in range(1,smaller + 1):
       if((x % i == 0) and (y % i == 0)):
           hcf = i
   return hcf
# 用户输入两个数字
num1 = int(input("输入第一个数字: "))
num2 = int(input("输入第二个数字: "))
 
print( num1,"和", num2,"的最大公约数为", hcf(num1, num2))

30、正则表达式re.match与re.search的区别

re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search 匹配整个字符串,直到找到一个匹配。

31、id,name,class,xpath, css selector这些属性,你最偏爱哪一种,为什么?

css 、xpath 几乎所有的元素都可以定位到,但是它们的短处在于页面上更改了元素后位置很容易改变,所以首先使用的还是id或者name等。

32、如何去定位属性动态变化的元素?

xpath或者css通过同级、父级、子级进行定位

或者

可以使用的方法有:
starts-with(以什么开始)
ends-with(以什么结束)
contains 包含

以contains 为例子:

比如我们在定位中使用的xpath定位一个使用下拉框中的某一项值,我们得到的xpath为
.//[@id=‘cascader-menu-3932’]/li[1]
目标下拉框元素中的3932是一个后台动态加载给前台的值,每次刷新网页都会变化,这个时候使用传统的xpath定位,一定是找不到该元素的,可以将上述标黄的部分改写成模糊匹配
[@id=‘cascader-menu-3932’]
[contains(@id,“cascader-menu”)]
其他的部分不改变,直接搬回来,然后就可以正常定位了
.//* + [contains(@id,“cascader-menu”)] + /li[1] = .//[contains(@id,“cascader-menu”)]/li[1]

33、脚本找不到元素,报错无法定位元素,或者“定位到了,不能操作,点击无效”

1、等待时间,元素还未加载出来,强制等待、隐形等待、显性等待
2、切换frame(查找整个页面的frame,根据元素定位查看父级)切换frame,可以输入id,name,xpath,索引
3、元素属性值是否正确,id动态
4、检查元素属性是否是会变动的、是否是隐藏的:通过js去更改元素属性,让元素可操作

34、什么是page object设计模式?

简单来说,就是把页面作为对象,在使用中传递页面对象,来使用页面对象中相应的成员或者方法,能更好的体现面向对象语言(比如java或者python)的面向对象和封装特性。
页面对象设计模式具有以下有点:
a) 测试代码和页面特定代码(例如定位符和布局)之间有清晰的区分
b) 页面提供的服务或操作只有一个存储库(比如一个py文件),不需要把服务分散到整个测试中

35、什么是断言?

断言的英文是assertion,断言检查的英文是assertion checking。
断言是指定一个程序必须已经存在的状态的一个逻辑表达式,或者一组程序变量在程序执行期间的某个点上必须满足的条件。

36、你觉得自动化测试最大的缺陷是什么?

1.不稳定
2.可靠性
3.不易维护
4.成本与收益

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126656.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号