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)
posted @ 2020-01-15 16:02  深圳-逸遥  阅读(288)  评论(0编辑  收藏  举报