zoukankan      html  css  js  c++  java
  • Selenium(一):元素定位

    一、Selenium 8种定位方式

    baidu.html

    <form id="form" name="f" action="/s" class="fm">
        <span class="bg s_ipt_wr quickdelete-wrap">
            <span class="soutu-btn"> </span>
            <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
            <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
    

    1、通过id属性值定位

    HTML 规定 id 属性在 HTML 文档中必须是唯一

    driver.find_element_by_id('kw')
    

    2、通过name属性值定位

    driver.find_element_by_name('wd')
    

    3、通过class属性值定位

    driver.find_element_by_class_name('s_ipt')
    

    4、通过tag定位(标签名定位)

    driver.find_element_by_tag_name('input')
    

    5、通过文本链接定位

    link.html

    <a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a>
    
    driver.find_element_by_link_text('新闻')
    

    6、通过文本链接模糊匹配进行定位

    driver.find_element_by_partial_link_text('新')
    

    7、Xpath定位

    • 绝对定位
    • 相对定位

    绝对定位百度搜索框

    driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input')
    

    相对定位

    表达式 描述
    / 从根节点选取。
    // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
    @ 选取属性。

    7.1、使用标签+元素属性定位

    # //标签名[@属性名='属性值']
    driver.find_element_by_xpath("//input[@id='kw']")
    

    7.2、使用标签层级+标签+元素属性定位

    # //标签名[@属性名='属性值']/标签名
    driver.find_element_by_xpath("//span[@class='bg s_ipt_wr quickdelete-wrap']/input")
    driver.find_element_by_xpath("//span[@class='bg s_ipt_wr quickdelete-wrap']/input[2]")
    driver.find_element_by_xpath("//form[@id='form']/span/span/input[2]")
    

    7.3、Xpath 多属性定位

    # //标签名[@属性名='属性值' and @属性名='属性值']
    driver.find_element_by_xpath("//input[@id='kw' and @class='s_ipt']")
    

    更多语法查看XPath 语法

    8、CSS定位

    8.1、CSS ID 选择器

    ID 选择器前面有一个 # 号 - 也称为棋盘号或井号

    driver.find_element_by_css_selector('#kw')
    

    8.2、CSS 类选择器

    类名前有一个点号(.)

    driver.find_element_by_css_selector('.s_ipt')
    

    8.3、CSS 属性选择器

    # 单属性定位
    driver.find_element_by_css_selector("input[id='kw']")
    # 多属性定位
    driver.find_element_by_css_selector("input[id='kw'][name='wd']")
    # 以kw开头
    driver.find_element_by_css_selector("input[id=^'kw']")
    # 以kw结尾
    driver.find_element_by_css_selector("input[id=$'kw']")
    

    更多语法查看CSS 选择器语法


    二、Xpath定位 VS CSS定位

    image
    图片来源于网络


    三、By定位

    查看find_element_by_css_selector()函数

    webdriver.py

    from selenium.webdriver.common.by import By
    
    class WebDriver(object):
    
        def find_element_by_id(self, id_):
            return self.find_element(by=By.ID, value=id_)
            
        def find_element_by_name(self, name):
            return self.find_element(by=By.NAME, value=name)
            
        def find_element_by_tag_name(self, name):
            return self.find_element(by=By.TAG_NAME, value=name)
            
        def find_element_by_link_text(self, link_text):
            return self.find_element(by=By.LINK_TEXT, value=link_text)
            
        def find_element_by_partial_link_text(self, link_text):
            return self.find_element(by=By.PARTIAL_LINK_TEXT, value=link_text)
            
        def find_element_by_xpath(self, xpath):
            return self.find_element(by=By.XPATH, value=xpath)
            
        def find_element_by_css_selector(self, css_selector):
            return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
    

    通过查看源码我们得知可以使用更底层元素定位方法find_element(by=By.CSS_SELECTOR, value=css_selector)

    该方法的优势会在实际项目中的元素定位方法,显示等待方法封装中体现

    base_page.py

    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.common.exceptions import TimeoutException
    
    TIME_OUT = 10
    POLL_FREQUENCY = 0.5
    
    class BasePage():
    
        def __init__(self,driver):
            self.dirver = driver
    
        def find_element(self, locator):
            try:
                WebDriverWait(driver=self.driver, timeout=TIME_OUT,poll_frequency=POLL_FREQUENCY).until(EC.visibility_of_element_located(locator=locator))
            except TimeoutException as e:
                msg = "Time out when locate element using %s: %s" % (locator[0], locator[-1])
                raise TimeoutException(msg)
            return self.driver.find_element(*locator)
    
  • 相关阅读:
    【杂谈】SpringBoot为啥不用配置启动类
    【API知识】SpringBoot项目中@EnableXXX的原理
    【杂谈】再看生产-消费模式
    【杂谈】Hash表与平衡树
    【杂谈】如何对Redis进行原子操作
    【杂谈】从底层看锁的实现2
    【杂谈】从底层看锁的实现
    HashMap的简易解读
    定时任务、反射、注解
    值得收藏的js原型详解
  • 原文地址:https://www.cnblogs.com/snailrunning/p/12197204.html
Copyright © 2011-2022 走看看