1.如何判断元素是否出现?
判断元素是否出现,存在两种情况,一种是该元素压根就没有,自然不会出现;另外一种是有这样的元素,但是是hidden状态
可以通过先判断是否存在,如果不存在返回false;如果存在再去判断是否displayed。
2.如何判断一个页面上元素是否存在?
from selenium import webdriver def is_element_exsist(driver, locator): ''' 判断元素是否存在,存在返回 True,不存返回 False :param locator: locator 为元组类型,如("id", "kw") :return: bool 值,True or False ''' try: driver.find_element(*locator) return True except Exception as msg: print("元素%s 找不到:%s" % (locator, msg)) return False if __name__ == '__main__': driver=webdriver.Chrome() driver.get('https://www.baidu.com') loc1 = ("id", "kw") # 元素 1 print(is_element_exsist(driver, loc1))
from selenium import webdriver def is_element_exsist(driver, locator): ''' 判断元素是否存在,存在返回 True,不存返回 False :param locator: locator 为元组类型,如("id", "kw") :return: bool 值,True or False ''' eles = driver.find_elements(*locator) if len(eles) < 1: return False else: return True if __name__ == '__main__': driver=webdriver.Chrome() driver.get('https://www.baidu.com') loc1 = ("id", "kw") # 元素 1 print(is_element_exsist(driver, loc1))
from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait def is_element_exsist(driver, locator): ''' 结合 WebDriverWait 和 expected_conditions 判断元素是否存在, 每间隔 1 秒判断一次,30s 超时,存在返回 True,不存返回 False :param locator: locator 为元组类型,如("id", "kw") :return: bool 值,True or False ''' try: WebDriverWait(driver, 30, 1).until(EC.presence_of_element_located(locator)) return True except: return False if __name__ == '__main__': driver=webdriver.Chrome() driver.get('https://www.baidu.com') loc1 = ("id", "kw") print(is_element_exsist(driver, loc1))
3.如何提高脚本的稳定性
from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait def find(driver,locator, timeout=30): '''定位元素,参数 locator 是元祖类型, 如("id", "su")''' element = WebDriverWait(driver, timeout,1).until(EC.presence_of_element_located(locator)) return element if __name__ == '__main__': driver=webdriver.Chrome() driver.get('http://www.baidu.com') loc1 = ("id", "su")#百度点击按钮 print(find(driver,loc1))
1.属性动态变化是指该element没有固定的属性值,所以只能通过相对位置定位
比如通过xpath的轴, parent/following-sibling/precent-sibling等。 另外也可以尝试findbyelements遍历
2.id ,class,styles是动态的,根据元素属性定位(元素的 tag、name的步伐属性是不会变的)
5.什么PO模式?
PO模式是page object model的缩写,顾名思义, 是一种设计模式,把每个页面当成一个页面对象,页面层写定位元素方法和页面操作方法,
实现脚本的page和真实的网站页面Map起来,一 一对应起来。这样能测试框架更容易维护。
比如一个登陆页面,使用PO模式后,会创建一个class,该class会定义用户名输入框,密码输入框,登陆按钮的webElenent;
用例层从页面层调用操作方法,写成用例,这种模式可以做到定位元素与脚本分离。所以这样的设计理念就是PO模式。
6. 如何设计高质量自动化脚本
1. 使用四层结构实现业务逻辑、脚本、数据分离。
2. 使用PO设计模式,将一个页面用到的元素和操作步骤封装在一个页面类中。如果一个元素定位发生了改变,我们只用修改这个页面的元素属性。
3. 对于页面类的方法,我们尽量从客户的正向逻辑去分析,方法中是一个独立场景,例如:登录到退出,而且不要想着把所有的步骤都封装在一个方法中。
4. 测试用例设计中,减少测试用例之间的耦合度。
7.什么是断言?
断言的英文是assertion,断言检查的英文是assertion checking。断言是指定一个程序必须已经存在的状态的一个逻辑表达式,或者一组程序变量在程序执行期间的某个点上必须满足的条件。
9.一个元素明明定位到了,点击无效(也没报错),如果解决?
driver=webdriver.Chrome() driver.get('http://www.baidu.com') driver.implicitly_wait(5) driver.find_element_by_id('kw').send_keys('selenium') js = 'document.getElementById("su").click()' driver.execute_script(js)
10.报NoSuchElementException的原因可能是什么?
(1)二次定位
(2)定位iframe中的元素,需switch_to_iframe
(3)页面还没有加载出来就对页面的元素进行操作,可设置固定休眠时间、implicity_wait()是webDriver提供的超时等待,隐的等待一个元素被发现或者一个命令完成、WebDriverWait()
(4)动态属性无法定位,可根据相对路径或者部分元素属性定位。
(5)有两个属性相同的元素,但是其中一个不可见,找到符合这个属性且style属性中display=none的元素
(6)xpath描述错误
(7)页面加载太慢,前面的元素点击后,弹出的页面一直没有关闭,设置time.sleep(1)
11.如果截取某一个元素的图片,不要截取全部图片
from selenium import webdriver driver = webdriver.Chrome() driver.get('http://www.baidu.com/') #driver.get_screenshot_as_file截取整个页面 driver.get_screenshot_as_file('./screenshot.png') #web_element.screenshot 获取单个元素的图片(这里是百度一下按钮的图片) element = driver.find_element_by_id("su") element.screenshot('./su.png')
12.如何处理alert弹窗?
我们常见的alert弹窗有两种:基于windows弹窗和基于web页面弹窗
我们知道,webdriver是能够处理alert弹窗的,Selenium提供了Alert这个接口。
相关操作代码如下:
切换到Alert:alert = alert = driver.switch_to.alert()
点击弹窗上确定按钮:alert.accept();
点击弹窗的取消按钮:alert.dismiss()
获取弹窗上线上的文本文字内容:alert.getText()
有些弹窗还支持文本输入,这个可以把要输入字符通过sendkeys方法输入:alert.sendkeys()
13. XPath中使用单斜杠和双斜杠有什么区别?
如果XPath是从文档节点开始,它将允许创建“绝对”路径表达式。例如 “/ html / body / p”匹配所有的段落元素。
如果XPath在文档中的任意位置开始进行选择匹配,那么它将允许创建“相对”路径表达式。例如 “// p”匹配所有的段落元素。
14. 当有很多定位器时,如ID、名称、XPath、CSS定位器,我应该使用哪一个?
· 如果有唯一的名称或标识符可用,那么应该使用它们来代替XPath和CSS定位器。如果没有,那么CSS定位器应该被优先考虑,因为在大多数现代浏览器中,它们的评估速度比XPath更快。
15.举例一下你遇到过那些异常,在selenium自动化测试过程中
1. ElementNotSelectableException :元素不能选择异常
2. ElementNotVisibleException :元素不可见异常
3. NoSuchAttributeException :没有这样属性异常
4. NoSuchElementException:没有该元素异常
5. NoSuchFrameException :没有该frame异常
6. TimeoutException :超时异常
7. Element not visible at this point :在当前点元素不可见
16. findElement 和 FindElements有什么区别?
首先,两个都是查找元素,都支持八大元素定位方法。findElement()得到的只有一个元素,如果根据提供的元素定位方式找不到,会报noSuchElement异常。
findElements()返回的是一组元素,所以我们需要根据能够找到一组元素的表达式去定位,返回一组元素我们可以放在集合里,
这样我们就可以使用集合里面的迭代方法去遍历元素,拿到元素去做其他操作。
17. 如何获取页面标题,悬浮文本和错误文本,并验证?
标题,我们可以通过driver.getTitle()方法来得到一个字符串,然后使用字符串的containts方法或者equals方法去进行断言。
悬浮文本(tooltip),一般是利用Actions类,然后鼠标悬停方法,然后通过getText()方法来得到这个tooltip字符串。
错误信息,直接把这个错误字段先进行定位,然后通过getText()方法拿到错误文本,主要的断言有包含,相等,不相等,不包含,以什么开头等。
18.Selenium中有哪些验证点?
Selenium主要有三种验证点 -
-
检查页面标题
-
检查某些文字
-
检查某些元素(文本框,下拉菜单,表等)
19.在硒中处理多个弹出窗口的机制是什么?
· 可以使用命令getWindowHandles()来处理多个弹出窗口。然后将所有窗口名称存储到Set变量中并将其转换为数组。
接下来,通过使用数组索引,导航到特定的窗口。
driver.switchTo.window(ArrayIndex);
20.隐式等待与显式等待有什么不同?
隐式等待是设置的全局等待,分为
· 1、页面加载超时等待 ;
· 2、页面元素加载超时;
· 3、异步脚本超时。如果是页面元素超时,设置等待时间,是对页面中的所有元素设置加载时间。隐式等待是其实可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素或者时间结束。
· 显式等待只是用于特定搜索的一个计时器。它的可扩展性更强,你可以设置它来等待任何条件。通常情况下,可以使用一些预先构建的条件来等待元素变得可点击,可见,不可见等,或者只是编写适合需求的条件。
21. 关闭浏览器中quit和close的区别
两个都可以实现退出浏览器session功能,close是关闭你当前聚焦的tab页面,而quit是关闭全部浏览器tab页面,并退出浏览器session。
22.你写的测试脚本能在不同浏览器上运行吗,支持跨浏览器平台吗?
主要实现这个跨浏览器的思想就是,把浏览器类型写到配置文件,代码里写if语句去判断配置文件的浏览器的类型,来决定用什么浏览器去执行测试用例
23.你觉得自动化测试最大的缺陷是什么?
不稳定 可靠性 不易维护 成本与收益
24.点击登录按钮的替代方法是什么?
使用submit()方法,但只有在属性type = submit时才能使用它。
25.你如何获得当前页面的URL?
driver.driver.current_url
26.如何从文本框中获取打字文本?
通过将arg作为值传递来使用getAttribute(“value”)方法。