0


Selenium之Web元素定位

    Web页面主要由HTML、CSS和JavaScript脚本构成,当前大部分页面都是动态页面。Web页面中的各类视觉元素,如文本框、按钮、复选框、图品、超链接和表等,在Selenium中都被称为页面元素(web Elements)。

    Selenium提供了八种定位元素。

定位元素含义定位元素含义find_element_by_id通过ID定位元素find_elements_by_id通过ID定位一组元素find_element_by_name通过name定位元素find_elements_by_name通过name定位一组元素find_element_by_class_name通过class定位元素find_elements_by_class_name通过class定位一组元素find_element_by_xpath通过xpath定位元素find_elements_by_xpath通过xpath定位一组元素find_element_by_tag_name通过tag name定位元素find_elements_by_tag_name通过tag name定位一组元素find_element_by_css_selector通过css选择器定位元素find_elements_by_css_selector通过css选择器定位一组元素find_element_by_link_text通过元素标签对之间的文本信息定位元素find_elements_by_link_text通过元素标签对之间的文本信息定位一组元素find_element_by_partial_link_text通过元素标签对之间的部分文本信息来定位元素find_elements_by_partial_link_text通过元素标签对之间的部分文本信息来定位一组元素
注:通过ID、name、class属性是最常用来定位元素的方法。

一、ID定位

    ID(find_element_by_id)是Selenium中较常见的定位方式,一般情况下ID是唯一的,ID的唯一性也成为需要页面上元素较号的方法。

    用百度搜索框来举个例子,搜索框的HTML代码如下:
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

python代码如下:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
# 通过ID定位搜索框元素并赋值【测试】
driver.find_element_by_id("kw").send_keys("测试")
sleep(5)        # 页面停留5秒
driver.quit()    #关闭浏览器

二、name定位

    一般情况下name与id一样具有唯一性,同时也是作为使用频率较高的定位元素之一。

    百度搜索框HTML代码如下:
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

python代码如下:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
# 通过name来定位搜索框元素并赋值【测试】
driver.find_element_by_name("wd").send_keys("测试")
sleep(5)        # 页面停留5秒
driver.quit()    # 关闭浏览器

三、class定位

    大部分前端的央视是通过class来渲染,所以定位元素时还可以通过class来定位。class用来关联CSS中定义的属性。

百度搜索框HTML代码如下:

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

python代码如下:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_class_name("s_ipt").send_keys("测试")
sleep(5)
driver.quit()

注:有时某元素的class属性值由通过空格隔开的两个值组成(如【百度一下】按钮元素class=“bg s_btn”),这时通过class定位,只需取其中一个即可(class=“bg s_btn”仅仅使用“s_btn”)。

python代码如下:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
# 通过class定位搜索框并赋值【测试】
driver.find_element_by_class_name("s_ipt").send_keys("测试")
# 通过class定位【百度一下】按钮并点击
driver.find_element_bt_class_name("s_btn").click()
sleep(5)        # 页面停留5秒
driver.quit()     # 关闭浏览器

四、tag定位

    tag name方法是通过对HTML页面中tag name匹配方式来定位元素,类似于JavaScript中的getElementsByTagName()。tag name在某些特定场合下十分好用,比如:通过标签,<checkbox>的tag name可一次性定位到页面中的所有复选框元素。

在这里我们用Bing网站举例子,后面会讲到为啥不用百度来举例,以下是Bing首页输入框的HTML代码

<input id="sb_form_q" class="sb_form_q" name="q" type="search" maxlength="1000" autocomplete="off" aria-labelledby="sb_form_c" autofocus="" aria-controls="sw_as" aria-autocomplete="both" aria-owns="sw_as">

python代码如下:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://cn.bing.com")
driver.find_element_by_tag_name("input").send_keys("bella")
sleep(5)
driver.quit()

注意:通过标签名的定位方式需慎用,能不用尽量不要用,因为一个页面有大量重复的标签名,从而使Selenium找不到正确的元素;举例的Bing首页输入框能够执行且成功输入bella,具有一定的偶然性,换成百度就找不到会报错(如下图)。

这边提供一个例子,小伙伴可以试试。

HTML代码

<html>
    <head>
     <title>复选框测试实例</title>
    </head>
    <body>
     请选择你喜欢的水果</br>
      <input type="checkbox" name="fruit" value="apple">苹果</br>
      <input type="checkbox" name="fruit" value="orange">橘子</br>
      <input type="checkbox" name="fruit" value="mango">芒果</br>
    </body>
</html>

python代码:

# fruit
from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
# checkbox.html的路径要根据自己真正存放的地址
driver.get("file:///F://checkbox.html")

inputs = driver.find_elements_by_tag_name("input")
for i in inputs:
    # 使用type或name均可,因为三种水果的元素type和name都相同
    if i.get_attribute("type") == "checkbox":
        i.click()
        sleep(3)
driver.quit()

五、link定位

    find_element_by_link_text方法使通过文本链接来定位元素。以百度首页中顶部的【新闻】链接为例。

HTML代码:

<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>

单击【新闻】链接的python代码:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_link_text("新闻").click()
sleep(5)
driver.quit()

六、partial_link_text定位

     find_element_by_partial_link_text方法使通过文本链接的一部分文本来定位元素。以百度首页中顶部的【新闻】链接为例。

HTML代码:

<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>

单击【新闻】链接的python代码:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_link_text("新").click()
sleep(5)
driver.quit()

七、xpath定位

    当发现通过id、name、class无法定位元素时,可以尝试用xpath。建议:为了避免人工输入路径有可能引发的错误,尽量不要手动输入绝对路径,错误率太高了。

1、通过绝对路径定位

二话不说,直接上图:

手工输入太累了,还容易漏掉,直接用开发者工具快速获取xpath的绝对路径。选中搜索框元素,右击该元素的代码区域,选择【Copy|Copy full xpath】,直接把绝对路径复制下来,/html/body/div[1]/div[2]/div[5]/div[1]/div/form/span[1]/input

python代码:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
# 绝对路径定位
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input").send_keys("测试")
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input").click()
sleep(5)
driver.quit()

2、通过元素属性定位

    xpath除了使用绝对路径,也可以使用元素的某个属性值来定位。同样直接用开发工具复制就行,选中搜索框元素,右击代码区域,选择【Copy|Copy xpath】,就可以直接得到xpath值(//*[@id="kw"])

python代码:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")

# driver.find_element_by_xpath("//*[@id="kw"]").send_keys("测试")
# xpath定位不仅仅局限于id,也可以通过name或是class来实现
driver.find_element_by_xpath("//input[@name='wd']").send_keys("测试")
driver.find_element_by_xpath("//input[@class='bg s_btn']").click()
sleep(5)
driver.quit()

3、 多属性结合定位

搜索框的HTML代码:

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

搜索按钮的HTML代码:

<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn">

python代码:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")

driver.find_element_by_xpath("//input[@id='kw' and @name='wd'] ").send_keys("测试")
driver.find_element_by_xpath("//input[@id='su' and @class='bg s_btn']").click()
sleep(5)
driver.quit()

八、css定位

1、通过ID、name、class来定位

搜索框的HTML代码:

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

搜索按钮的HTML代码:

<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn">

python代码:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")

# driver.find_element_by_css_selector("#kw").send_keys("测试")  # 符号“#”代表id匹配
driver.find_element_by_css_selector("[name='wd']").send_keys("测试") # 符号“[]”代表name匹配
driver.find_element_by_css_selector(".s_btn").click()    # 符号“.”代表使用class匹配
sleep(5)
driver.quit()

九、find_element定位

前面介绍了八种定位元素的方法,webdriver还提供了另外一种方法find_element,其通过By来申明定位的方法,传入对应定位方法的定位参数。find_element需要传入两个参数,第一个参数是定位的类型,由By模块提供(使用前需要通过from selenium.webdriver.common.by import By 导入By模块);第二个参数是具体定位的方式。

以百度首页搜索框、按钮、以及顶部【新闻】来举例,HTML代码

#百度搜索框
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
# 百度一下按钮
<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn">

对应的python代码:

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")

# driver.find_element(By.NAME, "wd").send_keys("测试")   # 通过By.NAME
# driver.find_element(By.ID, "su").click()     # 通过By.ID
# driver.find_element(By.CLASS_NAME, "s_ipt").send_keys("测试")     # 通过By.CLASS_NAME
# driver.find_element(By.XPATH, "//*[@id='kw']").send_keys("测试")  # 通过By.XPATH
# driver.find_element(By.CSS_SELECTOR, ".s_btn").click()  # 通过By.CSS_SELECTOR
# driver.find_element(By.LINK_TEXT, "新闻").click()     # 通过By.LINK_TEXT
driver.find_element(By.PARTIAL_LINK_TEXT, "新").click()  # 通过By.PARTIAL_LINK_TEXT

sleep(4)
driver.quit()

本文转载自: https://blog.csdn.net/u011212074/article/details/140714728
版权归原作者 aiku1130 所有, 如有侵权,请联系我们删除。

“Selenium之Web元素定位”的评论:

还没有评论