zoukankan      html  css  js  c++  java
  • Selenium3+python3自动化(三十一)--元素定位参数化(find_element)

    前言

    元素定位有八种方法,那么有没有一种方法,可以把八种定位合为一种呢?也就是把定位的方式参数化,如,id,name,css等设置为一个参数,这样只需维护定位方式的参数就行了。find_element()可以实现。

    一、find_element()

    1.selenium元素定位里面其实是有这个方法的,只是大部分时候都是结合By方法使用,如下图

    # coding:utf-8
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    driver=webdriver.Chrome()
    driver.get("https://www.baidu.com")
    driver.find_element(By.ID,"kw").send_keys("xixi")
    

     二、查看By方法源码

    pycharm中,按住Ctrl,鼠标左键点击By

    class By(object):
        """
        Set of supported locator strategies.
        """
    
        ID = "id"
        XPATH = "xpath"
        LINK_TEXT = "link text"
        PARTIAL_LINK_TEXT = "partial link text"
        NAME = "name"
        TAG_NAME = "tag name"
        CLASS_NAME = "class name"
        CSS_SELECTOR = "css selector"
    

     由源码可知,By.ID相当于是"id",那我们在请求时,可以直接使用"id"替换By.ID,这样也不用再导入By模块。

    # coding:utf-8
    from selenium import webdriver
    # from selenium.webdriver.common.by import By
    import time
    driver=webdriver.Chrome()
    driver.get("https://www.baidu.com")
    # driver.find_element_by_id("kw").send_keys("xixi")
    # time.sleep(2)
    
    # driver.find_element(By.ID,"kw").send_keys("hehe")
    # time.sleep(2)
    driver.find_element("id","kw").send_keys("gege")
    
    time.sleep(2)
    driver.find_element("xpath","//span/input[@id='kw']").send_keys("good")
    
    time.sleep(2)
    #注意"link text"中间是空格
    driver.find_element("link text","资讯").click()
    
    time.sleep(2)
    driver.find_element_by_link_text("新闻").click()

     三、find_element和find_element_by_xxx的区别

    1.pycharm中,导入相应的包,按照正常流程书写,输入driver.find_element(),按住Ctrl键,鼠标左键点击find_element,打开并跳转到源码页面;

    2.输入driver.find_element_by_id(),按住Ctrl键,鼠标左键点击find_element_by_id,打开并跳转到源码页面;

    3.查看源码,发现find_element_by_xxx的方法都是返回的find_element方法,也就是说那八个定位方法其实就是八个小分支。

        def find_element(self, by=By.ID, value=None):
            """
            Find an element given a By strategy and locator. Prefer the find_element_by_* methods when
            possible.
    
            :Usage:
                element = driver.find_element(By.ID, 'foo')
    
            :rtype: WebElement
            """
            if self.w3c:
                if by == By.ID:
                    by = By.CSS_SELECTOR
                    value = '[id="%s"]' % value
                elif by == By.TAG_NAME:
                    by = By.CSS_SELECTOR
                elif by == By.CLASS_NAME:
                    by = By.CSS_SELECTOR
                    value = ".%s" % value
                elif by == By.NAME:
                    by = By.CSS_SELECTOR
                    value = '[name="%s"]' % value
            return self.execute(Command.FIND_ELEMENT, {
                'using': by,
                'value': value})['value']
    

     

        def find_element_by_id(self, id_):
            """Finds an element by id.
    
            :Args:
             - id\_ - The id of the element to be found.
    
            :Returns:
             - WebElement - the element if it was found
    
            :Raises:
             - NoSuchElementException - if the element wasn't found
    
            :Usage:
                element = driver.find_element_by_id('foo')
            """
            return self.find_element(by=By.ID, value=id_)
    
    越努力,越幸运!!! good good study,day day up!!!
  • 相关阅读:
    自动化测试-02-Unittest-单元测试框架介绍
    自动化测试-01-cookie认识
    Java面试汇总
    多线程总结一:基本概念
    用Java编写你自己的简单HTTP服务器
    Spring高级事务管理难点剖析
    Http协议详解
    Java 互联网工程师要具备哪些技能或技术?
    架构师都要懂哪些知识
    java学习路线
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13602819.html
Copyright © 2011-2022 走看看