• Selenium常见面试题汇总1


    1.如何判断元素是否出现?

     判断元素是否出现,存在两种情况,一种是该元素压根就没有,自然不会出现;另外一种是有这样的元素,但是是hidden状态

     可以通过先判断是否存在,如果不存在返回false;如果存在再去判断是否displayed。

    2.如何判断一个页面上元素是否存在?

    判断元素存在方法有三种:
    方法一,用 try...except...
    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))
    方法二:用 elements 定义一组元素方法
    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))
    (强烈推荐!)方法三:结合 WebDriverWait 和 expected_conditions 判断
    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.如何提高脚本的稳定性

    “如何提高 selenium 脚本的执行速度?”
    “selenium 中如何保证操作元素的成功率?也就是说不管网络加载慢还是快”
    "如何保证我点击的元素一定是可以点击的?"
      优化方向:1.不要右键复制 xpath,自己写相对路径,多用 id 为节点查找
           2.定位没问题,第二个影响因素那就是等待了,sleep 等待尽量少用(影响执行时间)driver.implicitly_wait(30)这个等待也不要用,不要以为是全局的就是好事,
           有些 js 加载失败时候会一直等,并且页面跳转时候也无法识别
           3.通过封装find方法实现,结合 WebDriverWait 和 expected_conditions【_find_element或者_find_elements】判断元素方法,自己封装一套定位元素方法
    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))
     
    4如何去定位属性动态变化的元素?

    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。断言是指定一个程序必须已经存在的状态的一个逻辑表达式,或者一组程序变量在程序执行期间的某个点上必须满足的条件。

    8.如何通过子元素定位父元素
     
    子元素定位父元素,可以通过 xpath 的语法直接定位:.//*[@name="Lara"]/..      两个点..就是代表父级元素了
     

    9.一个元素明明定位到了,点击无效(也没报错),如果解决?

    注意:使用 js 点击,selenium 有时候点击元素是会失效
    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”)方法。

     
    “学习必须如蜜蜂一样,采过许多花,这才能酿出蜜来。”
  • 相关阅读:
    电商需求与表结构设计参考
    使用EF操作Oracle数据库小计
    jenkins构建随笔
    NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(转载)
    api接口签名相关文章
    C# 如何防止重放攻击(转载)
    .NET 4中的多线程编程之一:使用Task(转载)
    Flash 无法输入中文的修正方法
    Nape的回调系统 nape.callbacks
    Nape刚体body.align();
  • 原文地址:https://www.cnblogs.com/Lara1798/p/12856540.html
Copyright © 2020-2023  润新知