第三章 选择元素 - WebElement

UI自动化流程

UI应用自动化(包括web应用自动化)流程,主要包括

  1. 选择界面元素
  2. 操作元素 : 包括点击、输入文字、拖拽和获取元素的各种属性
  3. 根据界面上获取的数据进行分析和处理。

Selenium完美的解决前2两个问题,而第3 个则是基于我们前面学过的python语言的知识,推荐大家可以从这里学习白月黑羽教Python

Webdriver

可以把WebDriver对象想象成一个控制整个浏览器的遥控器,可以使用它来打开浏览器并操作web页面元素,例如:

  • 在当前页面上的选择符合查找条件的对象
  • 打开指定网址,回退,前进,刷新网页
  • 获取、改变浏览器窗口大小,关闭浏览器,截屏
  • 获取、设置cookies

WebDriver对象选择和查找的范围是整个html 文档。

WebElement

WebElement 对象可以看成是对应某个页面元素的遥控器,通过它可以操作某个元素相关的东西,比如:

  • 在当前web元素的所有子元素里面符合查找条件的对象
  • 操作该web元素,比如:
  • 点击元素
  • 输入字符
  • 获取元素坐标、尺寸、文本内容、其它的属性信息

通过WebElement对象选择,查找范围是该对象的子元素

WebElement方法

web自动化的难点和重点就是如何正确的选择我们想要操作的web页面选择,基本的方法如下:

  • 格式:driver.find_element_by_XX

    1. driver.find_element_by_id()
    2. driver.find_element_by_name()
    3. driver.find_element_by_class_name()
    4. driver.find_element_by_tag_name()
    5. driver.find_element_by_link_text()
    6. driver.find_element_by_partial_link_text()

例如:

# 找不到返回异常
eleObj = driver.find_element_by_class_name('teacher')
print(eleObj.text)

为了避免返回异常,通常我们需要通过try-except来捕捉异常,对异常进行处理,类似下面这样

# 检查是否存在某一属性
try:
    eleObj = driver.find_element_by_class_name('teacher')
    print(f'find: {eleObj.text}')
except NoSuchElementException as e:
    print(f"don't exist, raise error: {e}")
  • 格式:driver.find_elements_by_XX

    1. driver.find_elements_by_name()
    2. driver.find_elements_by_class_name()
    3. driver.find_elements_by_tag_name()
    4. driver.find_elements_by_link_text()
    5. driver.find_elements_by_partial_link_text()

例如

# 找不到返回空列表
eleObjList = driver.find_elements_by_class_name('teacher')
for eleObj in eleObjList:
    print(eleObj.text)

WebElement方法说明

假设我们有如下的一个web页面,需要利用Selenium对其进行操作

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SKNet</title>
    <base target="_blank" />
    <style type="text/css">
        .teacher {color:black}

    </style>
</head>

<body>
    <h2>Web元素选择测试界面</h2>
    <p>欢迎来到思凯网络学习平台 - 思凯网络,专注起点</p>
    <hr />

    <div style="background-color:#99FFFF; color:black; padding:10px; font-family:Comic Sans MS; font-size:16px; text-align:left;">
        <p>段落:我们为什么推荐编程0基础的朋友从python入手学习编程语言? 为什么不是Java、C、C++、Javascript?因为Python 易学好用。Python 的创造者们,创建出Python 语言,出发点就是希望它 既 简单易用又高效又强大。所以天生就携带易学好用的基因</p>
    </div>

    <div>
        <a href="http://www.baidu.com" id="baidu">百度搜索</a><br />
        <a href="http://www.baidu.com" id="baidu2">百度搜索2</a><br />
        <a href="http://www.python3.vip" id="BYHY">白月黑羽--在线教程</a><br>
    </div>
<br>
    <div>
        <button name='button'>测试按钮1</button><br />
        <button name='button'>测试按钮2</button>
    </div>

    <div>
        <p class="teacher">BYHY</p>
        <p class="teacher">SK</p>
        <p class="teacher">小凯老师</p>
        <p class="teacher">小雷老师</p>
    </div>

        <p>===========================================</p><br>
    </div>
</body>
</html>
  • 选择白月黑羽在线教程网站:_by_id
# find_element_by_id
# 找不到返回异常
eleObj = driver.find_element_by_id('BYHY')
print(eleObj.text)

id 是web元素非常特殊的一个属性,它是在DOM中唯一标志这个元素的,所以,通常操作页面元素,首先是尝试通过ID来选择他,也是效率最高的,如果没有ID,再通过其他的方式来定位元素。

  • 选择测试按钮:by_name
#
# find_element_by_name
# 找不到返回异常
eleObj = driver.find_element_by_name('button')
print(eleObj.text)

# # find_elements_by_name
# 找不到返回空列表, 不会产生异常
eleObjList = driver.find_elements_by_name('button')
for eleObj in eleObjList:
    print(eleObj)
    print(eleObj.text)
  • 选择老师:by_class_name
# 找不到返回异常
eleObj = driver.find_element_by_class_name('teacher')
print(eleObj.text)

# 找不到返回空列表
eleObjList = driver.find_elements_by_class_name('teacher')
for eleObj in eleObjList:
    print(eleObj.text)
  • 选择所有div元素:by_tag
# find_element_by_tag_name
# 找到返回第一个tag name,找不到返回异常
eleObj = driver.find_element_by_tag_name('div')
print(eleObj.text)

# find_elements_by_tag_name
# 找不到返回空列表
eleObjList = driver.find_elements_by_tag_name('div')
for eleObj in eleObjList:
    print(eleObj.text)
  • 选择百度:by_link_text
# find_element_by_link_text
# 通过全文本信息
# 找不到返回异常
eleObj = driver.find_element_by_link_text('百度搜索')
print(eleObj.text)

# 通过全文本信息
# 找不到返回空列表
eleObjList = driver.find_elements_by_link_text('百度')
print(eleObjList)
for eleObj in eleObjList:
    print(eleObj.text)
  • 选择百度:by_partial_link_text
# 通过部分文本信息定位
eleObj = driver.find_element_by_partial_link_text('百度')
print(eleObj.text)

# 通过部分文本信息定位
# 找不到返回空列表
eleObjList = driver.find_elements_by_partial_link_text('百度')
print(eleObjList)
for eleObj in eleObjList:
    print(eleObj.text)
  • 获取文本信息
# 通过部分文本信息定位
eleObj = driver.find_element_by_partial_link_text('百度')
print(eleObj.text)
  • 获取页面元素的属性

通过get_attribute方法

#get_attribute方法
eleObj = driver.find_element_by_id("BYHY")
print(eleObj.get_attribute('href'))
  • 获取HTML源码

通过get_attribute的两个特殊属性 outerHTML和innerHTML

  1. get_attribute(‘outerHTML’)
  2. get_attribute(‘innerHTML’)
eleObjList = driver.find_elements_by_class_name('teacher')
for eleObj in eleObjList:
    if (eleObj.get_attribute('value') == 'Kai') & (eleObj.text == '小凯老师'):
        print(f'找到小凯老师')
        print(eleObj.get_attribute('outerHTML'))

web自动化实战

  1. 访问百度
  2. 搜索“天气预报”
  3. 获取当地的最新天气情况
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from selenium import  webdriver
import  selenium, time

driver = webdriver.Chrome(r"G:\Education\BYHY\Courseware\Improvement\Selenium\chromedriver.exe")
time.sleep(3)
# ================================================

# open URL by baidu
driver.get('https://www.baidu.com/')

element_keyword = driver.find_element_by_id('kw') .send_keys('天气预报')
element_search_button = driver.find_element_by_id('su').click()
time.sleep(3)
#print(driver.title)
#print(driver.current_window_handle)

# driver.find_element_by_id('1')
eleObj = driver.find_element_by_id('1')
eleObj = driver.find_element_by_partial_link_text('中国天气网').click()
time.sleep(3)

# 切换窗口
print('before: ' + driver.current_window_handle)
print(driver.title)
mainWindow = driver.current_window_handle
for handle in driver.window_handles:
    driver.switch_to.window(handle)
    if '天气预报一周' in driver.title:
        break
print('after: ' + driver.current_window_handle)
print(driver.title)

time.sleep(3)
eleObj = driver.find_element_by_id('w_weather')
# eleObj = driver.find_element_by_css_selector('#w_weather ')

cityName = eleObj.find_element_by_class_name('city_name').text

eleObj = driver.find_element_by_id('hidden_title')
weatherInfo = eleObj.get_attribute('value')
print(f"{cityName}: {weatherInfo}")
# ================================================
input('Please input any key to continue......')
# Quit
driver.quit()


本文还不错? 分享给你的朋友吧

上一页 下一页