【selenium学习 -3】selenium中的八种基础定位方式

在上节中我说到,我理解的自动化的主要流程是启动-定位-操作-断言,这节主要介绍定位的八种基本方法

在平时写码的过程中,IDE也会有相应的提示

  单个元素 多个元素
1.根据id定位
find_element_by_id()

2.根据name定位
find_element_by_name()
find_elements_by_name()
3.根据class定位
find_element_by_class_name()
find_elements_by_class_name()
4.根据tag定位
find_element_by_tag_name()
find_elements_by_tag_name()
5.根据link text定位
find_element_by_link_text()
find_elements_by_link_text()
6.根据partial_link定位
find_element_by_partial_link_text()
find_elements_by_partial_link_text()
7.根据xpath定位
find_element_by_xpath()
find_elements_by_xpath()
8.根据css选择器定位
find_element_by_css_selector()
find_elements_by_css_selector()

下面将依次进行举例说明,都以百度为例:

1.根据id进行定位

from selenium import webdriver

if __name__ == '__main__':
    driver = webdriver.Chrome()  # 1.打开浏览器
    driver.maximize_window()  # 最大化窗口
    driver.get("https://www.baidu.com/")  # 2.打开百度

    try:
        driver.find_element_by_id("kw")
        print("通过ID找到元素")
    except Exception as e:
        print("没有找到元素", format(e))

    driver.quit()

通过try except语句来进行了断言,在平时的工程操作中,经常会做一些异常的处理,这个例子,我们通过find_element_by_id()来学习通过id进行定位

 

2.根据name进行定位

from selenium import webdriver

if __name__ == '__main__':
    driver = webdriver.Chrome()  # 1.打开浏览器
    driver.maximize_window()  # 最大化窗口
    driver.get("https://www.baidu.com/")  # 2.打开百度

    try:
        driver.find_element_by_name("wd")
        print("通过name找到元素")
    except Exception as e:
        print("没有找到元素", format(e))

    driver.quit()

 

3.根据class进行定位

HTML结构

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
from selenium import webdriver
import time

if __name__ == '__main__':
    driver = webdriver.Chrome()  # 1.打开浏览器
    driver.maximize_window()  # 最大化窗口
    driver.get("https://www.baidu.com/")  # 2.打开百度
    time.sleep(1)
    try:
        driver.find_element_by_class_name("s_ipt")
        print("通过class name找到元素")
    except Exception as e:
        print("没有找到元素", format(e))

    driver.quit()

如果要找多个相同的class的元素,使用 find_elements_by_class_name("xxx")

 

4.根据tag定位

什么是tag呢

<div class='s-bottom-layer-left'>
    <p class='1h'>...</p>
    <p class='1h'>...</p>
    <p class='1h'>...</p>
    <p class='1h'>...</p>
    <p class='1h'>...</p>
</div>

其中像<div> <p> 这类就是tag name

from selenium import webdriver
import time

if __name__ == '__main__':
    driver = webdriver.Chrome()  # 1.打开浏览器
    driver.maximize_window()  # 最大化窗口
    driver.get("https://www.baidu.com/")  # 2.打开百度
    time.sleep(1)
    try:
        driver.find_element_by_tag_name('p')
        print("通过class name找到元素")
    except Exception as e:
        print("没有找到元素", format(e))

    driver.quit()

但由于此类tag类筛选出来的选项过多,所以实际应用比较少,知道有这一种方法就可以了

 

5.根据link text定位

 像百度首页这些文字,都是link text,我们可以通过文本,比如“新闻”,“地图”等文字,定位到该标签

<div id="s-top-left" class="s-top-left s-isindex-wrap">
    <a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>
    <a href="https://www.hao123.com" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>
    <a href="http://map.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">地图</a>
    <a href="https://haokan.baidu.com/?sfrom=baidu-top" target="_blank" class="mnav c-font-normal c-color-t">视频</a>
    <a href="http://tieba.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">贴吧</a>
    <a href="http://xueshu.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">学术</a>
</div>
from selenium import webdriver
import time

if __name__ == '__main__':
    driver = webdriver.Chrome()  # 1.打开浏览器
    driver.maximize_window()  # 最大化窗口
    driver.get("https://www.baidu.com/")  # 2.打开百度
    time.sleep(1)
    try:
        driver.find_element_by_link_text('新闻')
        print("通过link text找到元素")
    except Exception as e:
        print("没有找到元素", format(e))

    driver.quit()

 

6.根据partial_link定位

此种定位方式,和text定位有些类似,有点模糊匹配的感觉,比如,上例中,有一个hao123的文本text,可以用“hao”进行一个类似于模糊匹配

from selenium import webdriver
import time

if __name__ == '__main__':
    driver = webdriver.Chrome()  # 1.打开浏览器
    driver.maximize_window()  # 最大化窗口
    driver.get("https://www.baidu.com/")  # 2.打开百度
    time.sleep(1)
    try:
        driver.find_element_by_partial_link_text('hao').click()
        print("通过partial link text找到元素")
    except Exception as e:
        print("没有找到元素", format(e))

    driver.quit()

通过点击 hao123 文本,来观察是否匹配到了元素,一般这种情形下,个人更喜欢用xpath进行定位

 

7.根据xpath定位

如上例中,点击hao123

from selenium import webdriver
import time

if __name__ == '__main__':
    driver = webdriver.Chrome()  # 1.打开浏览器
    driver.maximize_window()  # 最大化窗口
    driver.get("https://www.baidu.com/")  # 2.打开百度
    time.sleep(1)
    try:
        driver.find_element_by_xpath('//*[@id="s-top-left"]/a[text()="hao123"]').click()
        time.sleep(2)
        print("通过xpath找到元素")
    except Exception as e:
        print("没有找到元素", format(e))

    driver.quit()

xpath定位是我在工作中用的最多的方式,几乎可以达到90%以上,要获取xpath路径,可以通过F12 ->直接右键元素-> copy-> copy Xpath获取,也可以自己写,这里推荐一个chrome插件

Xpath Helper

 

8.根据css选择器定位

<input type="submit" id="su" value="百度一下" class="bg s_btn">
from selenium import webdriver
import time

if __name__ == '__main__':
    driver = webdriver.Chrome()  # 1.打开浏览器
    driver.maximize_window()  # 最大化窗口
    driver.get("https://www.baidu.com/")  # 2.打开百度
    time.sleep(1)
    try:
        ele = driver.find_element_by_css_selector("#su").get_attribute("value")
        print(ele)
        print("通过css selector找到元素")
    except Exception as e:
        print("没有找到元素", format(e))

    driver.quit()

这个例子通过css选择器定位“百度一下”这个按钮,并打印文本

 

 

总结:说了这么多种定位方式,个人感觉用的最多的还是xpath,毕竟像id,name这些,不是每个元素都一定有,但无论什么情况,用xpath几乎都能搞定

posted @ 2020-05-14 11:42  RonyJay  阅读(342)  评论(0编辑  收藏  举报