Loading...
墨滴

Steven2022

2021/11/23  阅读:47  主题:默认主题

selenium常见八大元素定位解析

无论是做UI自动化测试,还是爬虫,页面元素定位始终都是我们必须要做的工作,Selenium WebDriver API 中提供了大量的方法帮助我们进行元素定位,有许多方法对页面的元素进行定位,可以根据自己的需要选择最合适的一种。selenium提供了8种元素定位的方法,接下来给大家解析8大元素定位方式,以及自己封装灵活的元素定位方式。

1. ID元素定位

  • 基于元素属性中的id的值来进行定位,id是一个标签的唯一属性值,可以通过id属性来唯一定位一个元素,是首选的元素定位方式,动态ID不做考虑。
driver.find_element_by_id('id')
driver.find_element(By.ID, 'id')

2. name元素定位

  • 基于元素属性中的name的值来进行定位,但name并不是唯一的,很可能会出现重名。
driver.find_element_by_name('name')
driver.find_element(By.NAME,'name')

3. class_name元素定位

  • 基于元素class样式来定位,非常容易遇到重复的,这个方法的参数只能是一个class值,列如:class属性有空格隔开两个class的值时,只能选取其中一个进行定位。
driver.find_element_by_class_name('class_name')
driver.find_element(By.CLASS_NAME,'class_name')

4. tag_name元素定位

  • 通过元素的标签名来定位元素,如:input标签、span标签;标签名来进行定位元素,重复度最高,只有在需要定位后进行二次筛选的情况下使用。
driver.find_element_by_tag_name('tag_name')
driver.find_element(By.TAG_NAME, 'tag_name')

5. css_selector元素定位

  • css可以通过元素的id、class、属性、子元素、后代元素、index、兄弟元素等多种方式进行元素定位.
5.1通过ID定位,如:input id="kw"
driver.find_element_by_css_selector('div#kw')
driver.find_element(By.CSS_SELECTOR, 'div#kw')
5.2 通过class定位,如:input class="is_put"
driver.find_element_by_css_selector('input.is_put')
driver.find_element(By.CSS_SELECTOR, 'input.is_put')
5.3 通过属性定位,如:input name="kw"
driver.find_element_by_css_selector('input[name=kw]')
driver.find_element(By.CSS_SELECTOR, 'input[name=kw]')
5.4 通过子元素定位,与xpath不同,css中用">"右箭头代表子元素,而xpath中用的"/"单斜杠表示
driver.find_element_by_css_selector('div#kw>a')
driver.find_element(By.CSS_SELECTOR, 'div#kw>a')
5.5 通过后代元素定位
driver.find_element_by_css_selector('div#kw a')
driver.find_element(By.CSS_SELECTOR, 'div#kw a')
5.6 通过元素的index值定位元素
driver.find_element_by_css_selector('div#kw>a:nth-child(1)')
driver.find_element(By.CSS_SELECTOR, 'div#kw>a:nth-child(1)')
5.7 通过元素兄弟元素定位元素
  • css的定位到的是兄弟元素下面的兄弟元素,而且只是下面的第1个元素(如:span元素id为"kw"有很多input兄弟元素,它只定位到它下面的第1个兄弟元素);而xpath不同的是可以定位到所有兄弟元素;
driver.find_element_by_css_selector('span#kw+input)')
driver.find_element(By.CSS_SELECTOR, 'span#kw+input')

6. link_text元素定位

  • 主要用于超链接进行定位,全部匹配文本值,使用在链接位置处,例如:a标签
driver.find_element_by_link_text('link_text')
driver.find_element(By.LINK_TEXT, 'link_text')

7. partial_link_text元素定位

  • 基于链接的部分文字来定位,link text模糊匹配,模糊查询匹配到多个符合调节的元素,选取第一个,同样也只使用在链接位置处,例如:a标签
driver.find_element_by_partial_link_text('partial_link_text')
driver.find_element(By.PARTIAL_LINK_TEXT, 'partial_link_text')

8. xpath元素定位

  • xpath是一门在xml文档中查找信息的语言。xpath可用来在xml文档中对元素和属性进行遍历。由于html的层次结构与xml的层次结构天然一致,所以使用xpath也能够进行html元素的定位。xpath的功能非常强大,通过xpath的各种方式组合,能够解决selenium自动化测试中界面元素定位的绝大部分问题。
8.1 xpath通过绝对路径定位元素
  • 将 Xpath 表达式从 html 的最外层节点,逐层填写,最后定位到操作元素,这种方法,一旦路径有变化会导致定位失败,所以不推荐使用该方式。
driver.find_element_by_xpath('/html/body/div[4]/div[1]/a')
driver.find_element(By.XPATH, '/html/body/div[4]/div[1]/a')
8.2 xpath通过相对路径定位元素
  • 绝对路径与相对路径的差别与文件系统中的绝对和相对路径类似,相对路径是只给出元素路径的部分信息,在html的任意层次中寻找符合条件的元素,语句以//开始。
driver.find_element_by_xpath('//form/span')
driver.find_element(By.XPATH, '//form/span')
8.3 xpath通过元素属性定位元素
  • 单属性定位://input[@name='pwd']表示name属性为pwd的input
driver.find_element_by_xpath("//input[@name='pwd']")
driver.find_element(By.XPATH, "//input[@name='pwd']")
  • 多属性定位://a[@title="tutorial" and @rel="follow"]
driver.find_element_by_xpath('//a[@title="tutorial" and @rel="follow"]')
driver.find_element(By.XPATH, '//a[@title="tutorial" and @rel="follow"]')
8.4 xpath通过属性值模糊匹配定位元素
  • xpath模糊匹配的函数有两种:starts-with和contains
  • starts-with://label[starts-with(@class,'btn')],class属性值以btn开头的label元素
driver.find_element_by_xpath("//label[starts-with(@class,'btn')]")
driver.find_element(By.XPATH, "//label[starts-with(@class,'btn')]")
  • contains://label[contains(@class,'btn')],通过属性值包含btn的label元素
driver.find_element_by_xpath("//label[contains(@class,'btn')]")
driver.find_element(By.XPATH, "//label[contains(@class,'btn')]")
8.5 xpath通过文本定位元素
  • 文本内容的定位是利用html的text字段进行定位的方法,//span[text()='下一步'],由于 “下一步” 这几个字是浏览器界面就可以看到的, “所见即所得”,这种特征改的可能性非常小,优先推荐使用。与属性值类似,文本内容也支持starts-with和contains模糊匹配。
driver.find_element_by_xpath("//span[text()='下一步']")
driver.find_element(By.XPATH, "//span[text()='下一步']")

9. 页面常见的元素定位封装

  • 自己封装灵活的元素定位方式,有助于提升代码的可维护性、可读性、可靠性
    def locate_element(self, key):
        """
        通过key获取对象库里面的具体对象
        :param key:
        :return:
        "
""
        data = self.library.get_value(key)
        locate_method = data.split('>')[0]
        value = data.split('>')[1]
        try:
            if locate_method == 'id':
                return self.get_web_element(By.ID, key, value)
            elif locate_method == 'name':
                return self.get_web_element(By.NAME, key, value)
            elif locate_method == 'className':
                return self.get_web_element(By.CLASS_NAME, key, value)
            elif locate_method == 'cssSelector':
                return self.get_web_element(By.CSS_SELECTOR, key, value)
            elif locate_method == 'linkText':
                return self.get_web_element(By.LINK_TEXT, key, value)
            elif locate_method == 'partialLinkText':
                return self.get_web_element(By.PARTIAL_LINK_TEXT, key, value)
            elif locate_method == 'tagName':
                return self.get_web_element(By.TAG_NAME, key, value)
            else:
                return self.get_web_element(By.XPATH, key, value)
        except Exception as e:
            error_msg = '通过【{}:{}】获取【{}】元素异常,异常信息:{}'.format(locate_method, value, key, e)
            logger.error(error_msg)
            return self.error_info(key, locate_method, value, error_msg)
1
1

Steven2022

2021/11/23  阅读:47  主题:默认主题

作者介绍

Steven2022