选择/操控元素的方法
根据前端代码中的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')
<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')
类似的,我们可以通过指定参数为 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)
不仅 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() |
获取整个元素对应的HTML | element.get_attribute(‘xxxxHTML’) | 整个元素对应的HTML文本内容: element.get_attribute(‘outerHTML’) 某个元素内部的HTML文本内容: element.get_attribute(‘innerHTML’) |
获取输入框里面的文字 | get_attribute(‘value’) | element.get_attribute(‘value’) |
获取元素文本内容2 | get_attribute(‘innerText’) get_attribute(‘textContent’) | 只显示元素可见文本内容: element.get_attribute(‘innerText’) 显示所有内容(包括display属性为none的部分) :element.get_attribute(‘textContent’) |
=============================================================================================================