Python+Selenium面试题(附详细解答)

Python+Selenium面试题(附详细解答)一、选择题(1分18题,共18分)1.下面哪些关于自动化测试的说法是错误的:(ACD)A.自动化测试可以完全取代手工测试B.自动化测试可以大幅度减少测试团队的工作量C.性能测试不能自动化D.自动化测试能够发现大量的新缺陷2.下列哪种是Python元组的定义方式?(ABCD)A.([2,3],1) B.(1,) C.(1,{“name”:”sex”}) D….

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

一、选择题(1分/题,共18分)

1.下面哪些关于自动化测试的说法是错误的:( ACD )
A.自动化测试可以完全取代手工测试
B.自动化测试可以大幅度减少测试团队的工作量
C.性能测试不能自动化
D.自动化测试能够发现大量的新缺陷

【加戏】自动化测试用于回归测试,主要目的是发现旧缺陷。手工测试主要目的才是发现新缺陷。

2.下列哪种是Python元组的定义方式?( ABCD )
A. ([2,3],1)
B. (1, )
C. (1, {“name”:”sex”})
D. (1, 2, (3, 4))

【加戏】①元组中元素可以是任意类型的Python对象。②元组中只有一个元素时,必须加上逗号。

In [4]: a=(1)
In [5]: type(a) 
Out[5]: int

In [6]: a=(1,) 
In [7]: type(a) 
Out[7]: tuple 

3.下述字符串格式化语法正确的是?( D )
A)‘GNU’s Not %d %%’%‘UNIX’
B)‘GNU’s Not %d %%’%‘UNIX’
C)‘GNU’s Not %s %%’%‘UNIX’
D)’GNU\‘s Not %s %%’%‘UNIX’

【加戏】python里面%d表数字,%s表字符串,%%表示一个%。A和B向%d传了字符串,所以错误。单引号内嵌套单引号需要加转义字符\,所以C错误。

4.下面代码运行后,a、b、c、d四个变量的值,描述错误的是? ( D )
import copy
a = [1, 2, 3, 4, [‘a’, ‘b’]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a.append(5)
a[4].append(‘c’)
A. a ==[1,2, 3, 4, [‘a’, ‘b’, ‘c’], 5]
B. b ==[1,2, 3, 4, [‘a’, ‘b’, ‘c’], 5]
C. c ==[1,2, 3, 4, [‘a’, ‘b’, ‘c’]]
D. d ==[1,2, 3, 4, [‘a’, ‘b’, ‘c’]]

【加戏】d = [1, 2, 3, 4, [‘a’, ‘b’]] https://blog.csdn.net/maoxuexue/article/details/105909574

5.下列代码的运行结果是?( D )
print (‘a’ < ‘b’ < ‘c’)
A. a
B. b
C. c
D. True
E. False
F.运行报错

【加戏】Python支持连续比较,‘a’<‘b’<‘c’相当于’a’<‘b’ and ‘b’<‘c’,其本质是字符
ASCII码数值的大小比较。a是97,b是98,c是99,A是65,B是66,C是67。

In [1]: 97 < 98 < 99 
Out[1]: True

In [2]: 97 < 98 > 90 
Out[2]: True

6.下列代码运行结果是?( D )
a = ‘a’ print(a > ‘b’ or ‘c’)
A. a
B. False
C. True
D. c
E. b
F.运行报错

【加戏】其一, 比较运算符>逻辑运算符。其二, x or y 的值只可能是x或y. x为真就是x, x为假就是y。第三, x and y
的值只可能是x或y. x为真就是y,
x为假就是x。‘a’>’b’为False。https://blog.csdn.net/maoxuexue/article/details/105899512

7.python my.py v1 v2 命令运行脚本,通过 from sys import argv如何获得v2的参数值? ( C )
A. argv[0]
B. argv[1]
C. argv[2]
D. argv[3]

【加戏】sys.argv是传递给python脚本的命令行参数【字符串】列表,包括文件名 argv[0]: 【path】/my.py
argv[1]: v1 argv[2]:
v2。argv[0]为该脚本自身路径,argv[1]和argv[2]是传递的两个命令行参数。https://blog.csdn.net/maoxuexue/article/details/105902675

8.如何解释下面的执行结果? ( C )
print 1.2 – 1.0 == 0.2 ———> False
A.Python的实现有错误
B.布尔运算不能用于浮点数比较
C.浮点数无法精确表示
D. Python将非0数视为False

【加戏】

In [22]: 1.2-1.0 
Out[22]: 0.19999999999999996

9.a与b定义如下,下列哪个是正确的?( C )
a = ‘123’ b = ‘123’
A.a != b
B.a == 123
C.a is b
D.a + b = 246

【加戏】https://blog.csdn.net/maoxuexue/article/details/105903101

10.下列哪种函式参数定义不合法? ( C )
A. def myfunc(*args):
B. def myfunc(arg1=1):
C. def myfunc(*args, a=1):
D. def myfunc(a=1, **args):

【加戏】https://blog.csdn.net/maoxuexue/article/details/105904906

11.下面代码运行结果?( C )

a = 1
try:
    a += 1
except:
    a += 1
else:
    a += 1
finally:
    a += 1
print(a)

A. 2
B. 3
C. 4
D. 5

【加戏】a=1→执行try: a += 1,a=2→没有异常→执行else: a += 1,a=3→执行finally: a +=
1,a=4

12.下列表达式的值为True的是(C )
A、(2**=3)<(2*=3)
B、3=””>2>2
C、1 == 1 and 2 != 1
D、not(1==1 and 0!=1)

【加戏】A、B都报错。

13.以下不能创建一个字典的语句是( C )
A、dict1 = {}
B、dict2 = { 3 : 5 }
C、dict3 = {[1,2,3]: “uestc”}
D、dict4 = {(1,2,3): “uestc”}

【加戏】字典的键不能是可修改的类型,如列表和字典。

14.下列代码运行结果是? ( C )

a = map(lambda x: x**3, [1, 2, 3])
list(a)

A. [1, 6, 9]
B. [1, 12, 27]
C. [1, 8, 27]
D. (1, 6, 9)

【加戏】匿名函数:x=x的3次方。

15.Python中函数是对象,描述正确的是? ( ABCD )
A.函数可以赋值给一个变量
B.函数可以作为元素添加到集合对象中
C.函数可以作为参数值传递给其它函数
D.函数可以当做函数的返回值

【加戏】python中,一切皆对象。函数是一种函数类型的对象

16.若 a = range(100),以下哪些操作是合法的? ( ABCD )
A. a[-3]
B. a[2:13]
C. a[::3]
D. a[2-3]

【加戏】range(100)表示range(0,100);a[-3]表示倒数第三个数;a[2:13]表示range(2,
13);a[::3]实际上是a[start : end : step],表示a(0,100,3),步长为3,取0、3、6…99 ;a[2-3]表示倒数第一个数。

17.若 a = (1, 2, 3),下列哪些操作是合法的? ( ABD )
A. a[1:-1]
B. a*3
C. a[2] = 4
D. list(a)

【加戏】A. a[1:-1]表示把第一个元素和最后一个元素删除,只剩一个元素时,后要加逗号;B.
a*3—->(1,2,3,1,2,3,1,2,3);C. 元组不可修改;D. list(a)—->[1, 2, 3]

18.Python中单下划线_foo与双下划线__foo与__foo__的成员,下列说法正确的是?( ABC )
A. _foo 不能直接用于’from module import *’
B. __foo解析器用_classname__foo来代替这个名字,以区别和其他类相同的命名
C. __foo__代表python里特殊方法专用的标识
D. __foo 可以直接用于’from module import *’

【加戏】https://blog.csdn.net/maoxuexue/article/details/105907236

二、代码阅读题(5分/5题,共25分)
1.阅读下面的代码,写出A0,A1至An的最终值。(说明zip函数的使用等价元组解包的概念实现变量与值一一对应)

A0 = dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))
A1 = range(10)
A2 = [i for i in A1 if i in A0]
A3 = [A0[s] for s in A0]
A4 = [i for i in A1 if i in A3]
A5 = { 
   i:i*i for i in A1}
A6 = [[i,i*i] for i in A1]

答案
A0 = {‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5}

【加戏}https://www.runoob.com/python3/python3-func-zip.html

A1 = range(0, 10)
A2 = []

【加戏】i in A1,i 是数字。if i in A0 判断 i 是否是 A0的键,A0的键是字符串,所以False。没有值,空列表。

A3 = [1, 2, 3, 4, 5]
A4 = [1, 2, 3, 4, 5]
A5 = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
A6 = [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]]

2.下面代码会输出什么:

def f(x,l=[]):
    for i in range(x):
        l.append(i*i)
	print(l)
f(2)
f(3,[3,2,1])  
f(3)		

答案:
[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]

【注意这里的坑!!!】https://blog.csdn.net/maoxuexue/article/details/105911940

3.下面代码会输出什么:

def f(*args,**kwargs): 
	print(args, kwargs)
	
l = [1,2,3]
t = (4,5,6)
d = { 
   'a':7,'b':8,'c':9}

f()							     	 
f(1,2,3)                             
f(1,2,3,"groovy")                
f(a=1,b=2,c=3)                  
f(a=1,b=2,c=3,zzz="hi")     
f(1,2,3,a=1,b=2,c=3)          
f(*l,**d)                               
f(*t,**d)                               
f(1,2,*t)                              
f(q="winning",**d)             
f(1,2,*t,q="winning",**d)  

答案:
() {}
(1, 2, 3) {}
(1, 2, 3, ‘groovy’) {}
() {‘a’: 1, ‘b’: 2, ‘c’: 3}
() {‘a’: 1, ‘b’: 2, ‘c’: 3, ‘zzz’: ‘hi’}
(1, 2, 3) {‘a’: 1, ‘b’: 2, ‘c’: 3}
(1, 2, 3) {‘a’: 7, ‘b’: 8, ‘c’: 9}
(4, 5, 6) {‘a’: 7, ‘b’: 8, ‘c’: 9}
(1, 2, 4, 5, 6) {}
() {‘q’: ‘winning’, ‘a’: 7, ‘b’: 8, ‘c’: 9}
(1, 2, 4, 5, 6) {‘q’: ‘winning’, ‘a’: 7, ‘b’: 8, ‘c’: 9}

4.下列语句的执行结果是什么?

def diff(listA,listB):
    retA = [i for i in listA if i in listB]
    retB = list(set(listA).intersection(set(listB)))
    print("retA is: ",retA)
    print ("retB is: ",retB)
    retC = list(set(listA).union(set(listB)))
    print ("retC1 is: ",retC)
    retD = list(set(listB).difference(set(listA)))
    print("retD is: ",retD)
    retE = [i for i in listB if i not in listA]
    print("retE is: ",retE)
def main():
    listA = [1,2,3,4,5]
    listB = [3,4,5,6,7]
    diff(listA,listB)
if __name__ == '__main__':
    main()

答案:
retA is: [3, 4, 5]
retB is: [3, 4, 5]

【加戏】set表示集合。set.intersection(set1, set2 … etc)返回两个集合的交集,即set1和set2共有的元素。

retC1 is: [1, 2, 3, 4, 5, 6, 7]

【加戏】set.union(set1, set2…)返回两个集合的并集,即set1和set2所有的元素。重复元素只能出现一次。

retD is: [6, 7]

set1.difference(set2)返回两个集合的差集,即set1有set2没有的元素。也可以用set1-set2表示。

retE is: [6, 7]

5.下列代码的运行结果是多少?

def bar(n):
    m = n
    while True:
        m += 1
        yield m
b = bar(3)
print(next(b))

答: 4

【加戏】b=bar(3)的b返回一个生成器对象,直到调用next()方法才返回4。一个带有 yield 的函数就是一个 generator,它不会执行任何函数代码。直到对其调用 next()(在 for 循环中会自动调用 next()),才开始执行。虽然执行流程仍按函数流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。

def bar(n):
    m = n
    while True:
        m += 1
        yield m 
b = bar(3) 
print(b) 
print(next(b))
b = bar(4)
print(next(b))
b = bar(5)
print(next(b))

执行结果:
<generator object bar at 0x00000205A12AB430>
4
5
6

三、问答题(4分/8题,共32分)
1.什么是lambda函数?它有什么好处?
定义:lambda函数,称匿名函数,也称高效函数。它是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数。(注意:lambda 函数不能包含命令,包含的表达式不能超过一个)
作用:1.lambda函数比较轻便,即用即扔,很适合需要完成某一项简单功能,但是这个简单的功能只在此一处使用,连名字都很随意的情况下;2、lambda是匿名函数,一般用来给filter,map,reduce这样的函数式编程服务;3、作为回调函数,可以传递给某些应用,比如消息处理等。

2.举例一下你遇到过那些异常,在selenium自动化测试过程中?
1.ElementNotSelectableException:元素不可选异常
2.ElementNotVisibleException:元素不可见异常
3.NoSuchAttributeException:没有此属性异常
4.NoSuchElementException:没有此元素异常
5.NoSuchFrameException:没有此frame异常
6.NoSuchWindowException:没有此窗口异常
7.NoAlertPresentException:没有此消息框异常
8.TimeoutException:超时异常

3.介绍一下Selenium的原理(webdriver的原理)?

【加戏】https://blog.csdn.net/maoxuexue/article/details/105936001

4.简述你所知道的延时等待方式?
1)强制等待,又称强制休眠:调用time模块下的方法sleep(x),等待x秒后,进行下一步操作。
优点:使用简单,可以在调试时使用。
缺点:1、该方式只能作用于当前行的休眠操作,如果存在多行的休眠操作,则需要每行都设置,导致代码冗余。2、不能准确把握需要等待的时间(有时操作还未完成,等待就结束了,导致报错;有时操作已经完成了,但等待时间还没到,浪费时间)。如果在用例中大量使用,会浪费不必要的等待时间,影响测试用例的执行效率。
2)隐式等待,也称智能等待,也称全局等待:通过驱动器对象调用implicitly_wait(x),在x秒内,页面加载完成,进行下一步操作。否则等待x秒后,进行下一步操作。
优点:作用于整个脚本生命周期,设置一次即可。
缺点:程序会一直等待整个页面加载完成,才执行下一步操作;但有时所需的元素早已加载完成,只因页面个别元素还没加载完成,仍要等到页面全部加载完成才执行下一步操作,使用也不是很灵活。
3)显式等待:WebDriverWait(驱动器对象, 最长等待时间, 检查间隔时间, 要忽略的异常).until(要执行的方法, 超时时返回的错误信息),程序每隔x秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过最长等待时间,然后抛出TimeoutException异常。
优点:等待判断准确,不会浪费时间,在用例中使用,可以提高执行效率。
缺点:使用相对比较复杂。

5. 当存在ID、Name、Css、Xpath等四种定位器时,在以往工作中你会优先选择哪一种?
答:在实际工作中,如果元素定位器的ID、Name的值不存在重复且是唯一标识的话,则优先使用ID、Name;在实际定位中,css样式定位的效率要比xpath定位的效率高,所以优先使用css。

6.解释可迭代对象、迭代器、生成器?
1)可迭代对象(iterable):可迭代对象必然会满足可迭代协议,必然会存在一个内置方法__iter__。常用的可迭代对象:list、tuple、dict、set,str。可迭代对象包含迭代器。
2)迭代器(iterator):迭代器必然会符合可迭代对象协议,必然会存在两个内置方法:iternext。可通过内置函数iter()将可迭代对象转换成迭代器。也可通过内置方法__next__或内置函数next()获取迭代器中的每个元素,若是取完后再取会抛出StopIteration异常。
3)生成器(generator ):生成器是一种特殊的迭代器,它自动实现了“迭代器协议”,不需再手动实现__iter__和__next__方法。它的返回值不是通过return而是用yield,所以具有yield关键字的函数都是生成器。在直接调用next方法或用for语句进行下一次迭代时,生成器会从yield下一句开始执行,直至遇到下一个yield。

7.什么是selenium、什么是POM,为什么要使用它?
答:
1)
定义:selenium是一款web自动化测试框架。
使用原因:1、开源、免费;2、支持多平台(windows、linux、mac)、多浏览器(firefox、chrome、ie、opera、safari)、多语言(java、phthon、ruby、php、c#、javascript)。
2)
定义:POM页面对象设计模式是Page Object Model的简称,它一种分层开发的设计模式:以页面为单位,把一个页面上所有的元素操作封装到一个类里面,每一个元素操作对应地定义一个类方法。
使用原因(关联另一个面试题:如果页面元素经常发生需求变化,该如何做?答采用POM):如果页面元素经常发生需求变化,采用POM就只需修改这个页面对象的元素定位和相关方法,而无需修改测试脚本。

8. 怎么提高Selenium脚本的执行速度?
在设置等待时间时,使用webdriverwait配合until进行条件判断,可以通过检测某个元素出现后中断等待来提高速度。

四、编程题(25分)
1.使用一句代码完成(除导包代码)
编写程序,生成包含20个随机数的列表,然后将前10个元素升序排列,后10个元素降序排列,并输出结果。(7分)

import random
print(sorted([random.randint(0, 100) for i in range(10)])+sorted([random.randint(0, 100) for j in range(10)],reverse=True))

【加戏】sorted 语法:sorted(iterable, cmp=None, key=None, reverse=False)。参数说明:reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

2. 编程,如图,在文件score.yaml中存在四名学生的姓名、学号和3门考试课的成绩,然后将需要读取yaml中数据写入到mysql数据库中,请使用代码将整个过程进行实现。(18分)
在这里插入图片描述

import yaml

#获取yaml中的数据
def get_data():
    list1 = []
    with open("score.yaml", encoding="utf-8") as fp:
        get_yaml = yaml.safe_load(fp)
        get_result = get_yaml["student_score"]
        for record in get_result:
            list1.append(list(record.values()))
        print(list1)
    return list1

#将获取的数据写入数据库
import pymysql

class Mysql_Class:
    def __init__(self):

    self.get_conn = pymysql.Connect(host="127.0.0.1", user="root", password="123456", database="test1310", port=3306)
    self.get_cursor = self.get_conn.cursor()

def insert_many_data(self):
    str_sql = "insert into score values(%s,%s,%s,%s,%s);"
    self.get_cursor.executemany(str_sql, get_data())
    self.get_conn.commit()

if __name__ == '__main__':
    mysql = Mysql_Class()
    mysql.insert_many_data()

加分题(10分):
编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2019-012-05 17:12:11 f1 run写入到日志文件中,日志文件路径可以指定。

import time,os
def outer(logfile):
    def deco(func):
        if not os.path.exists(logfile):
            with open(logfile,'w',encoding = 'utf-8') as f:
                pass
        def inner(*args,**kwargs):
           res = func(*args,**kwargs)
           with open(logfile,'a',encoding = 'utf-8') as f:
            f.write('%s %s run'%(time.strftime('%Y-%m-%d %H:%M:%S'),func.__name__))
        return inner
    return deco
@outer('test.txt')
def index():
    print('this is my index')
index()**
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

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

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

(0)
blank

相关推荐

  • windows安装git教程_git安装教程图文详解

    windows安装git教程_git安装教程图文详解1.版本控制概述1.1Git什么是版本控制在我们日常生活中,使用微信6.5.3版本,QQ7.4版本,Chrome43.0.2357.65版本,表示的都是某些软件使用的版本号。这些软件在开发过程中,版本都是由1不断的变化而来。对于软件公司来说,软件的开发过程中的变化,都需要记录下来,从而方便软件开发的管理,这个过程就是版本控制。也就是,记录若干文件内容变化,以便将来查阅特定版本修订情况的系统(软件)。1.2常见版本控制软件CVS表示并发版本系统,是老版本控制软件系统,市面上基本上不使用了。

  • busybox 安装方法「建议收藏」

    busybox 安装方法「建议收藏」busyboxpro是一个集成了一百多个最常用linux命令和工具的软件,集成了一个http服务器和一个telnet服务器,Android系统中自带的toolbox工具(/system/bin)比较简单,对于一些命令如find等支持的不好,可以Android系统中加入busybox,就可以使用常见的Linux命令,同时通过busybox可以定制Android的根文件系统。  首先,先把手

  • axios 上传文件 封装_使用axios上传文件,如何取消上传

    axios 上传文件 封装_使用axios上传文件,如何取消上传按楼上的方法,问题已决定,其实axios已经提供了方法。贴一下我自己的代码吧。//在data里声明一个sourcedata(){return{source:null,//取消上传}//上传文件letthat=this;letcancelToken=that.Axios.CancelToken;//Axios使我修改axios原型链了。that.source=cancelToken….

  • 102 二叉树层序遍历

    102 二叉树层序遍历层序遍历,每次层的输出是是一个一维数组,整个二叉树的输出结果是二维数组BFS遍历,依托于队列结构,每次在根节点出栈的时候,将其值加在结果列表中,然后将他的左右孩子节点入队列。层序遍历相对于BFS,需要知道每一层有多少个节点。因此,我们需要稍微修改一下代码,在每一层遍历开始前,先记录队列中的结点数量nn(也就是这一层的结点数量),然后一口气处理完这一层的n个结点。classSolution:deflevelOrder(self,root:TreeNode):.

  • 事务隔离级别与锁的对应关系_隔离级别和锁的关系

    事务隔离级别与锁的对应关系_隔离级别和锁的关系隔离级别org.springframework.transaction.annotation.Isolationpublic enum Isolation { DEFAULT(-1), READ_UNCOMMITTED(1), READ_COMMITTED(2), REPEATABLE_READ(4), SERIALIZABLE(8);}DEFAULT :这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是: READ_CO..

  • tracert 原理_公道杯原理图解

    tracert 原理_公道杯原理图解Tracert原理

发表回复

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

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