一、定位元素
Selenium有两类八种定位元素的方式。
1. 单个元素定位
- 基本方式
No. | 定位方式 | 方法 | 说明 |
---|---|---|---|
1 | ID定位 | browser.find_element_by_id("ID名") |
HTML标签ID属性 |
2 | 名字定位 | browser.find_element_by_name("名字") |
HTML表单标签名字属性 |
3 | 标签名定位 | browser.find_element_by_tag_name("标签名") |
HTML标签 |
4 | 类名定位 | browser.find_element_by_class_name("类名") |
HTML标签class属性 |
5 | CSS选择器定位 | browser.find_element_by_css_selector("CSS选择器") |
CSS选择器 |
6 | XPath定位 | browser.find_element_by_xpath("xpath") |
xpath |
7 | 链接文字 | browser.find_element_by_link_text("链接文字") |
a标签文本完全匹配 |
8 | 部分链接文字 | browser.find_element_by_link_text("部分链接文字") |
a标签文本部分匹配 |
- 实践
以百度的Logo图片和输入框为例
<img hidefocus="true" class="index-logo-src" width="270" height="129" usemap="#mp">
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
验证代码
from selenium import webdriver
import time
if __name__ == "__main__":
# 获取Chrome浏览器
browser = webdriver.Chrome()
# Chrome浏览器以Get方式访问百度
time.sleep(2)
# 浏览器最小化(这步只是为了演示方便,可以省略)
browser.minimize_window()
print("选取Baidu图标")
# 标签名定位
print(browser.find_element_by_tag_name("img"))
# 类名定位
print(browser.find_element_by_class_name("index-logo-src"))
# CSS选择器定位
print(browser.find_element_by_css_selector(".index-logo-src"))
# XPath定位
print(browser.find_element_by_xpath("//img[@class='index-logo-src']"))
print("选取输入框")
# ID定位
print(browser.find_element_by_id("kw"))
# 名字定位
print(browser.find_element_by_name("wd"))
# 标签名定位
print(browser.find_element_by_tag_name("input"))
# 类名定位
print(browser.find_element_by_class_name("s_ipt"))
# CSS选择器定位
print(browser.find_element_by_css_selector("input#kw"))
# XPath定位
print(browser.find_element_by_xpath("//input[@id='kw']"))
time.sleep(2)
# 浏览器关闭
browser.quit()
- 通用方式
需要加上引用
from import By
上面实例可以改写成
from selenium import webdriver
from import By
import time
if __name__ == "__main__":
# 获取Chrome浏览器
browser = webdriver.Chrome()
# Chrome浏览器以Get方式访问百度
time.sleep(2)
# 浏览器最小化(这步只是为了演示方便,可以省略)
browser.minimize_window()
print("选取Baidu图标")
# 标签名定位
print(browser.find_element(By.TAG_NAME, "img"))
# 类名定位
print(browser.find_element(By.CLASS_NAME, "index-logo-src"))
# CSS选择器定位
print(browser.find_element(By.CSS_SELECTOR, ".index-logo-src"))
# XPath定位
print(browser.find_element(By.XPATH, "//img[@class='index-logo-src']"))
print("选取输入框")
# ID定位
print(browser.find_element(By.ID, "kw"))
# 名字定位
print(browser.find_element(By.NAME, "wd"))
# 标签名定位
print(browser.find_element(By.TAG_NAME, "input"))
# 类名定位
print(browser.find_element(By.CLASS_NAME, "s_ipt"))
# CSS选择器定位
print(browser.find_element(By.CSS_SELECTOR, "input#kw"))
# XPath定位
print(browser.find_element(By.XPATH, "//input[@id='kw']"))
time.sleep(2)
# 浏览器关闭
browser.quit()
关于链接的定位
from selenium import webdriver
from import By
import time
if __name__ == "__main__":
# 获取Chrome浏览器
browser = webdriver.Chrome()
# Chrome浏览器以Get方式访问百度
time.sleep(2)
# 浏览器最小化(这步只是为了演示方便,可以省略)
browser.minimize_window()
# 链接定位
print(browser.find_element_by_link_text("关于百度"))
# 部分链接定位
print(browser.find_element_by_partial_link_text("关于"))
# 链接定位
print(browser.find_element(By.LINK_TEXT, "关于百度"))
# 部分链接定位
print(browser.find_element(By.PARTIAL_LINK_TEXT, "关于"))
time.sleep(2)
# 浏览器关闭
browser.quit()
2. 多个元素定位
- 基本方式
与上面的操作对应多个元素的定位,区别在于,单个元素定位函数名是find_element_by_*
,返回值是一个元素;多个元素定位函数名是find_elements_by_*
,返回值为多个元素组成的序列。 - 通用方式
browser.find_elements()
定位原则:不管白猫黑猫抓住老鼠就是好猫
from selenium import webdriver
from import By
from import Keys
from time import sleep, time
if __name__ == "__main__":
# 获取Chrome浏览器
browser = webdriver.Chrome()
start = time()
# Chrome浏览器以Get方式访问百度
sleep(2) # 强制等待
# 定位输入框
dds = browser.find_elements_by_tag_name("dd")
for dd in dds:
print("index:", dd.find_element_by_tag_name("i").text)
print("image:", dd.find_element_by_class_name("board-img").get_attribute("data-src"))
print("title:", dd.find_element_by_css_selector("p.name").text)
print("star:", dd.find_element_by_css_selector("p.star").text.strip()[3:])
print("releasetime:", dd.find_element_by_xpath("//p[@class='releasetime']").text[5:])
print("score:",
dd.find_element_by_css_selector("i.integer").text + dd.find_element_by_css_selector("i.fraction").text)
# print(browser.page_source) # 页面代码
# 用于延长展示时间
sleep(2)
end = time()
print("Run time:", end - start)
# 浏览器关闭
browser.quit()
二、页面操作
- 页面交互
常用操作
No. | 方法 | 功能 |
---|---|---|
1 | element.click() |
按钮单击 |
2 | element.send_keys("字符串") |
输入框输入字符串 |
3 | element.clear() |
清空输入框 |
from selenium import webdriver
from import By
from time import sleep
if __name__ == "__main__":
# 获取Chrome浏览器
browser = webdriver.Chrome()
# Chrome浏览器以Get方式访问百度
sleep(2)
# 浏览器最大化(这步只是为了演示方便,可以省略)
browser.maximize_window()
# 定位输入框,并输入框填写查询文字
browser.find_element_by_id("kw").send_keys("你好,Selenium")
# 定位[百度一下]按钮,并单击
browser.find_element_by_id("su").click()
sleep(2)
# 浏览器关闭
browser.quit()
模拟回车按键,代替单击按钮
from selenium import webdriver
from import By
from import Keys
from time import sleep
if __name__ == "__main__":
# 获取Chrome浏览器
browser = webdriver.Chrome()
# Chrome浏览器以Get方式访问百度
sleep(2)
# 浏览器最小化
browser.maximize_window()
# 定位输入框
input = browser.find_element_by_id("kw")
# 输入框填写查询文字
input.send_keys("你好,Selenium")
# 回车
input.send_keys(Keys.RETURN)
sleep(4)
# 浏览器关闭
browser.quit()
操作网页的下拉
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from time import sleep
if __name__ == '__main__':
driver = webdriver.Chrome()
driver.implicitly_wait(2)
# 定位select元素,并创建Select对象
select = Select(driver.find_element_by_id("mainDomainSelect"))
# 按照下标选择
select.select_by_index(2)
sleep(2)
# 按照文本选择
sleep(2)
# 按照值选择
sleep(2)
driver.quit()
三、页面操作
1. 页面等待
Selenium有两种等待方式,加上标准库的time.sleep()
,下面做一下比较。
No. | 方法 | 模块 | 导入方式 | 特点 | 等待对象 |
---|---|---|---|---|---|
1 | sleep() |
time |
from time import sleep() |
强制等待,固定休眠时间 | 等待时间到了 |
2 | implicitly_wait() |
webdirver |
from selenium import webdriver |
隐式等待定位元素,超时抛出异常 | 等待页面加载完成 |
3 | WebDriverWait() |
webdirver |
from selenium.webdriver.support.ui import WebDriverWait |
显式等待(每隔一段时间检测元素),超时抛出异常NoSuchElementException
|
等待元素加载完成 |
- 强制等待
from selenium import webdriver
from import By
from import Keys
from time import sleep, time
if __name__ == "__main__":
# 获取Chrome浏览器
browser = webdriver.Chrome()
start = time()
# Chrome浏览器以Get方式访问百度
sleep(2) # 强制等待
# 浏览器最大化
browser.maximize_window()
# 定位输入框
input = browser.find_element_by_id("kw")
# 输入框填写查询文字
input.send_keys("你好,Selenium")
# 回车
input.send_keys(Keys.RETURN)
# 用于延长展示时间
sleep(2)
end = time()
print("Run time:", end - start)
# 浏览器关闭
browser.quit()
- 隐式等待
隐式等待使用与time.sleep()
相似。
from selenium import webdriver
from import By
from import Keys
from time import sleep, time
if __name__ == "__main__":
# 获取Chrome浏览器
browser = webdriver.Chrome()
start = time()
# Chrome浏览器以Get方式访问百度
try:
browser.implicitly_wait(2) # 隐式等待
# 浏览器最大化
browser.maximize_window()
# 定位输入框
input = browser.find_element_by_id("kw")
# 输入框填写查询文字
input.send_keys("你好,Selenium")
# 回车
input.send_keys(Keys.RETURN)
# 用于延长展示时间
sleep(2)
end = time()
print("Run time:", end - start)
finally:
# 浏览器关闭
browser.quit()
- 显式等待
显式等待可以直接使用。
from selenium import webdriver
from import By
from import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep, time
if __name__ == "__main__":
# 获取Chrome浏览器
browser = webdriver.Chrome()
start = time()
# Chrome浏览器以Get方式访问百度
# 浏览器最大化
browser.maximize_window()
try:
# 隐式等待,定位输入框
WebDriverWait(browser, 2)
# 定位输入框
input = browser.find_element_by_id("kw")
# 输入框填写查询文字
input.send_keys("你好,Selenium")
# 回车
input.send_keys(Keys.RETURN)
# 用于延长展示时间
sleep(2)
end = time()
print("Run time:", end - start)
finally:
# 浏览器关闭
browser.quit()
显式等待通常与until()
方法一起使用,参数为等待的条件。
from selenium import webdriver
from import By
from import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep, time
if __name__ == "__main__":
# 获取Chrome浏览器
browser = webdriver.Chrome()
start = time()
# Chrome浏览器以Get方式访问百度
# 浏览器最大化
browser.maximize_window()
try:
# 隐式等待,定位输入框
input = WebDriverWait(browser, 2).until(
EC.presence_of_element_located((By.ID, "kw"))
)
# 输入框填写查询文字
input.send_keys("你好,Selenium")
# 回车
input.send_keys(Keys.RETURN)
sleep(2)
end = time()
print("Run time:", end - start)
finally:
# 浏览器关闭
browser.quit()
可以同时设置隐式等待和显式等待,等待是两者之间的最大者。
2. 多窗体操作
No. | 操作 | 方法 |
---|---|---|
1 | 获取当前窗口句柄 | driver.current_window_handle |
2 | 获取所有窗口句柄 | driver.window_handles |
3 | 切换到handle 的窗口 |
driver.switch_to.window(handle) |
4 | 关闭当前的窗口 | driver.close() |
说明
driver.close()
相当于关闭当前TAB选项卡
driver.quit()
是退出了整个浏览器
窗口句柄是窗口的唯一标识,可看做窗口的身份证号。
from selenium import webdriver
import time
if __name__ == '__main__':
driver = webdriver.Chrome()
# 打印当前窗口句柄
print(driver.current_window_handle)
driver.implicitly_wait(2)
# 定位导航栏上的链接,并依次打开
pages = driver.find_elements_by_css_selector('#nav_tab>a')
for page in pages:
page.click()
# 打印所有的窗口句柄
print(driver.window_handles)
# 依次切换每个窗口
for handle in driver.window_handles:
driver.switch_to.window(handle)
print(driver.title,driver.current_window_handle)
time.sleep(1)
# 依次关闭每个窗口
for handle in driver.window_handles:
driver.switch_to.window(handle)
driver.close()
time.sleep(1)
JS操作
selenium调用js基本方式
driver.execute_script("JavaScript代码")
1. 网页提示框
from selenium import webdriver
from time import sleep
if __name__ == '__main__':
driver = webdriver.Chrome()
driver.execute_script("alert('Helle Selenium')")
# 获取alert框
alert = driver.switch_to.alert
# 打印alert框文本
print(alert.text)
sleep(2)
# 单击确认按钮
alert.accept()
# 暂停5s
sleep(5)
# 关闭浏览器
driver.quit()
2. selenium模拟操作HTML5视频
from selenium import webdriver
from time import sleep
if __name__ == '__main__':
driver = webdriver.Chrome()
driver.implicitly_wait(3)
# 获取视频元素
video = driver.find_element_by_css_selector(".bilibili-player-video>video")
# 打印视频src属性
print(video.get_attribute("src"))
# 打印当前视频的地址(JS方式)
print(driver.execute_script("return arguments[0].currentSrc;", video))
# 播放视频
print("start")
driver.execute_script("return arguments[0].play()", video)
# 播放15s
sleep(15)
# 暂停播放
print("stop")
driver.execute_script("return arguments[0].pause()", video)
# 暂停5s
sleep(5)
# 关闭浏览器
driver.quit()