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)
  • 相关阅读:
    poj 2312 Battle City
    poj 2002 Squares
    poj 3641 Pseudoprime numbers
    poj 3580 SuperMemo
    poj 3281 Dining
    poj 3259 Wormholes
    poj 3080 Blue Jeans
    poj 3070 Fibonacci
    poj 2887 Big String
    poj 2631 Roads in the North
  • 原文地址:https://www.cnblogs.com/mmz-tester/p/13203867.html
Copyright © 2011-2022 走看看