Selenium框架学习笔记(二):选择/操控元素的方法

选择/操控元素的方法

  • 根据id属性选择

在这里插入图片描述

根据前端代码中的id属性选择

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

# 创建 WebDriver 对象
wd = webdriver.Chrome()

# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
wd.get('https://www.byhy.net/_files/stock1.html')

# 根据id选择元素,返回的就是该元素对应的WebElement对象
element = wd.find_element(By.ID, 'kw')

# 通过该 WebElement对象,就可以对页面元素进行操作了
# 比如输入字符串到 这个 输入框里
element.send_keys('通讯\n')
  • 根据 class属性选择元素

<body>
        
        <div class="plant"><span>土豆</span></div>
        <div class="plant"><span>洋葱</span></div>
        <div class="plant"><span>白菜</span></div>

        <div class="animal"><span>狮子</span></div>
        <div class="animal"><span>老虎</span></div>
        <div class="animal"><span>山羊</span></div>
</body>

所有的植物元素都有个class属性值为 plant。
所有的动物元素都有个class属性值为 animal。
如果我们要选择所有的动物, 就像下面可以这样写,

wd.find_elements(By.CLASS_NAME, 'animal')

注意:element后面多了个s
find_elements 返回的是找到的符合条件的所有元素,放在一个列表返回。
而如果我们使用find_element (注意少一个s) 方法, 就只会返回第一个元素。

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

# 创建 WebDriver 实例对象,指明使用chrome浏览器驱动
wd = webdriver.Chrome()

# WebDriver 实例对象的get方法 可以让浏览器打开指定网址
wd.get('https://cdn2.byhy.net/files/selenium/sample1.html')

# 根据 class name 选择元素,返回的是 一个列表
# 里面 都是class 属性值为 animal的元素对应的 WebElement对象
elements = wd.find_elements(By.CLASS_NAME, 'animal')

# 取出列表中的每个 WebElement对象,打印出其text属性的值
# text属性就是该 WebElement对象对应的元素在网页中的文本内容
for element in elements:
    print(element.text)

首先,大家要注意: 通过 WebElement 对象的 text属性可以获取该元素在网页中的文本内容。
所以 下面的代码,可以打印出 element 对应网页元素的文本

print(element.text)

若一个元素有多个class,如学生张三可以定义有多个类型:中国人和学生 , 中国人和学生都是张三的类型。
元素也可以有多个class类型 ,多个class类型的值之间用空格隔开,比如

<span class="chinese student">张三</span>

我们要用代码选择这个元素,可以指定任意一个class 属性值,都可以选择到这个元素,如下

element = wd.find_elements(By.CLASS_NAME,'chinese')

或者

element = wd.find_elements(By.CLASS_NAME,'student')

而不能这样写

element = wd.find_elements(By.CLASS_NAME,'chinese student')
  • 根据 tag名 选择元素

类似的,我们可以通过指定参数为 By.TAG_NAME ,选择所有的tag名为div的元素,如下所示

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

wd = webdriver.Chrome()

wd.get('https://cdn2.byhy.net/files/selenium/sample1.html')

# 根据 tag name 选择元素,返回的是 一个列表
# 里面 都是 tag 名为 div 的元素对应的 WebElement对象
elements = wd.find_elements(By.TAG_NAME, 'div')

# 取出列表中的每个 WebElement对象,打印出其text属性的值
# text属性就是该 WebElement对象对应的元素在网页中的文本内容
for element in elements:
    print(element.text)
  • 通过WebElement对象选择元素

不仅 WebDriver对象有选择元素 的方法, WebElement对象 也有选择元素的方法。
WebElement对象 也可以调用 find_elements, find_element 之类的方法
WebDriver 对象 选择元素的范围是 整个 web页面, 而
WebElement 对象 选择元素的范围是 该元素的内部。

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

wd = webdriver.Chrome()

wd.get('https://cdn2.byhy.net/files/selenium/sample1.html')

element = wd.find_element(By.ID,'container')

# 限制 选择元素的范围是 id 为 container 元素的内部。
spans = element.find_elements(By.TAG_NAME, 'span')
for span in spans:
    print(span.text)
  • 界面等待跳转方法(隐式等待)

通过睡眠方法sleep():

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

wd = webdriver.Chrome()

wd.get('https://www.byhy.net/_files/stock1.html')

element = wd.find_element(By.ID, 'kw')

element.send_keys('通讯\n')

# 等待 1 秒
from time import sleep
sleep(1)

element = wd.find_element(By.ID,'1')
print(element.text)

但是这样的方法这样也有很大问题,假如一个自动化程序里面需要10次等待,一次等待20s,就要花费 200秒。 而可能大部分时间, 服务器反映都是很快的,根本不需要等20秒, 这样就造成了大量的时间浪费了。

Selenium提供了一个更合理的解决方案,是这样的: 当发现元素没有找到的时候, 并不立即返回 找不到元素的错误。
而是周期性(每隔半秒钟)重新寻找该元素,直到该元素找到,或者超出指定最大等待时长,这时才 抛出异常(如果是 find_elements
之类的方法, 则是返回空列表)。 Selenium 的 Webdriver 对象 有个方法叫 implicitly_wait ,可以称之为
隐式等待 ,或者 全局等待 。 wd.implicitly_wait(10) 那么后续所有的 find_element 或者
find_elements 之类的方法调用都会采用上面的策略: 如果找不到元素, 每隔 半秒钟 再去界面上查看一次, 直到找到该元素,
或者过了10秒最大时长。

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

wd = webdriver.Chrome()
wd.implicitly_wait(10)

wd.get('https://www.byhy.net/_files/stock1.html')

element = wd.find_element(By.ID, 'kw')

element.send_keys('通讯\n')


# 返回页面 ID为1 的元素
element = wd.find_element(By.ID,'1')

print(element.text)
  • 界面基本操控方法归纳

操控方法示例
点击click()element.click()
输入字符串send_keys()element.send_keys(‘123’)
清空输入框clear()element.clear()
获取元素信息find_element()element = wd.find_element(By.ID, ‘animal’)
获取元素属性get_attribute(‘class’)element.get_attribute(‘class’)
关闭浏览器窗口quit()wd.quit()
获取整个元素对应的HTMLelement.get_attribute(‘xxxxHTML’)整个元素对应的HTML文本内容: element.get_attribute(‘outerHTML’)
某个元素内部的HTML文本内容: element.get_attribute(‘innerHTML’)
获取输入框里面的文字get_attribute(‘value’)element.get_attribute(‘value’)
获取元素文本内容2get_attribute(‘innerText’) get_attribute(‘textContent’)只显示元素可见文本内容: element.get_attribute(‘innerText’)
显示所有内容(包括display属性为none的部分) :element.get_attribute(‘textContent’)

=============================================================================================================

持续更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值