ps:该教程为selenium 3版本的使用
1.介绍
Selenium是一个自动化测试框架,它可以模拟用户在浏览器中的操作,例如点击、输入、提交表单等等。它可以用于自动化测试、网页爬虫、数据抓取等多种场景。
Selenium可以支持多种编程语言,例如Python、Java、C#等,同时也支持多种浏览器,例如Chrome、Firefox、Safari等。它的核心是WebDriver,WebDriver可以与不同的浏览器进行交互,并且提供了一系列的API,用于模拟用户在浏览器中的操作。
2.安装
首先,你需要安装 Selenium。你可以通过在终端或命令提示符中输入以下命令来安装它:
pip install selenium
接下来,你需要下载适用于你所使用的浏览器的 webdriver。例如,如果你要使用 Chrome 浏览器,你需要下载 Chrome 浏览器的 webdriver,可以从以下链接下载:
Chrome
下载 webdriver 后,你需要将它添加到你的系统环境变量中,以便 Selenium 可以找到它。
下面是一个使用 Selenium 打开网页并获取标题的示例:
from selenium import webdriver
# 创建浏览器实例
browser = webdriver.Chrome()
# 访问页面
browser.get('https://www.baidu.com/')
# 获取页面标题
print(browser.title)
# 关闭浏览器
browser.quit()
这个示例首先导入 webdriver 模块,然后创建一个 Chrome 浏览器实例。它使用 get 方法访问百度的网页,并使用 title 属性获取页面标题。最后,它调用 quit 方法关闭浏览器。
注意,在这个示例中,你需要替换 webdriver.Chrome() 为你所使用的浏览器的 webdriver。此外,你还需要下载适用于你所使用的浏览器的 webdriver,例如 Chrome 浏览器的 webdriver。
可以发现浏览器打开了百度,并且终端中输出了标题百度一下,你就知道
,说明安装成功!
3. browser对象属性与方法
在Selenium中,Browser对象代表一个Web浏览器窗口,提供了许多属性和方法来控制浏览器行为。下面是一些常用的Browser对象属性和方法:
属性:
current_url:获取当前浏览器窗口的URL。
title:获取当前页面的标题。
window_handles:获取当前浏览器所有窗口的句柄。
page_source:获取当前页面的HTML源代码。
方法:
get(url):加载指定的URL。
back():返回上一页。
forward():前进到下一页。
refresh():刷新当前页面。
close():关闭当前窗口。
quit():关闭所有窗口并退出浏览器。
maximize_window():最大化当前窗口。
set_window_size(width, height):设置当前窗口的大小。
下面是一个基础的示例,用于打开Google网站,搜索关键字并关闭浏览器:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# 创建Chrome浏览器对象
browser = webdriver.Chrome()
# 打开Google网站
browser.get("https://www.google.com")
# 查找搜索框并输入关键字
search_box = browser.find_element_by_name("q") # 找到 name="q"的标签,就是一个搜索标签
search_box.send_keys("Python") # 向搜索标签输入一些字
# 提交搜索
search_box.send_keys(Keys.RETURN) # 按下提交按钮
# 输出搜索结果数量 此时的browser已经到了搜索的页面,然后在搜索的页面找到id="result-stats" 的那个元素
results = browser.find_element_by_id("result-stats")
# 模拟在搜索框中输入搜索关键词并按下回车键来提交搜索。Keys.RETURN 是 selenium 中的一个特殊按键常量,表示回车键。
# 输出元素里的文本内容
print(results.text)
# 关闭浏览器
browser.quit()
4. 扫码成功登陆微博
该案例模仿浏览器登陆,然后扫码登陆微博的主页,最后打印出微博的标题
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# 初始化Chrome浏览器
driver = webdriver.Chrome()
# 打开微博登录页
driver.get("https://weibo.com/login.php")
driver.maximize_window()
print("成功打开微博页面")
# 等待页面加载
time.sleep(10)
# 切换到扫码登录页
driver.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[1]/div/a[2]').click()
print("成功点击扫码登陆")
# 等待二维码加载
time.sleep(20) # 此时扫码用微博手机扫码登陆
print(driver.title)
time.sleep(5)
# 关闭浏览器
driver.quit()
5. 利用selenium下载用户头像
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import requests
import os
driver = webdriver.Chrome()
# 打开页面
driver.get("https://weibo.com/u/2029906001?tabtype=album")
# 等待页面加载完成
'''
WebDriverWait等待目标图片元素出现,直到presence_of_element_located条件得到满足,或者超时时间达到10秒。等待期间,程序会每隔500毫秒检查一次条件是否得到满足。如果条件在超时时间内得到满足,程序继续执行;如果超时时间到达,程序将抛出TimeoutException异常。
'''
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="app"]/div[2]/div[2]/div[2]/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div/div/div[4]/div/div[1]/img')))
driver.execute_script("window.scrollBy(0,50)")
# 找到目标元素
img_tag = driver.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]/div[2]/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div/div/div[4]/div/div[1]/img')
img_url = img_tag.get_attribute('src')
print(img_url)
response = requests.get(img_url)
print(response.cookies)
print(response.status_code)
# 创建保存图片的目录
if not os.path.exists('images'):
os.makedirs('images')
# 从URL中提取文件名
filename = img_url.split('/')[-1]
# 将响应内容保存为图片文件
with open('images/' + filename, 'wb') as f:
f.write(response.content)
# 关闭浏览器
driver.quit()
6.常用的函数介绍
6.1webdriver.Chrome()
webdriver模块中的webdriver.Chrome()、webdriver.Firefox()等函数:用于启动对应浏览器的实例,返回一个WebDriver对象。
from selenium import webdriver
# 启动Chrome浏览器
driver = webdriver.Chrome()
# 启动Firefox浏览器
driver = webdriver.Firefox()
6.2 WebDriver对象的get(url)函数
用于访问指定的url。
from selenium import webdriver
# 启动Chrome浏览器
driver = webdriver.Chrome()
# 访问百度
driver.get('https://www.baidu.com')
6.3 find_element()
这个函数可以指定查找的方式,方式通过By指定出。
常见的查找方式包括By.ID、By.NAME、By.CLASS_NAME、By.TAG_NAME、By.LINK_TEXT、By.PARTIAL_LINK_TEXT、By.XPATH和By.CSS_SELECTOR等。
from selenium import webdriver
from selenium.webdriver.common.by import By # 注意 By的位置!
# 启动Chrome浏览器
driver = webdriver.Chrome()
# 访问百度
driver.get('https://www.baidu.com')
# 查找搜索框
search_box = driver.find_element_by_id('kw')
# 查找搜索按钮
search_button = driver.find_element(By.XPATH, '//input[@value="百度一下"]')
6.4 send_keys(value)
WebElement对象的send_keys(value)函数:用于在输入框中输入文本。
from selenium import webdriver
# 启动Chrome浏览器
driver = webdriver.Chrome()
# 访问百度
driver.get('https://www.baidu.com')
# 查找搜索框
search_box = driver.find_element_by_id('kw')
# 在搜索框中输入关键词
search_box.send_keys('Python')
6.5 click()
WebElement对象的click()函数:用于模拟点击操作。
from selenium import webdriver
# 启动Chrome浏览器
driver = webdriver.Chrome()
# 访问百度
driver.get('https://www.baidu.com')
# 查找搜索框
search_box = driver.find_element_by_id('kw')
# 在搜索框中输入关键词
search_box.send_keys('Python')
# 查找搜索按钮并点击
search_button = driver.find_element_by_id('su')
search_button.click()
6.6 presence_of_element_located
expected_conditions模块中的presence_of_element_located(locator)函数:用于等待元素加载完成。
EC.presence_of_element_located(locator)是Selenium WebDriver提供的等待条件之一,用于等待特定元素的存在。
参数:
locator: 元素定位器,可以是元组,包含两个值,第一个表示元素定位的方式(By.ID、By.XPATH、By.NAME等),第二个表示定位器的具体值(例如"myElement")。
返回值:
返回等待条件对象,用于后续等待调用。如果等待超时,将引发TimeoutException。如果在等待期间元素被找到,则返回该元素。
# 导入所需的模块
from selenium.webdriver.common.by import By # 导入Selenium中的定位方式。
# WebDriverWait类,创建一个等待对象
from selenium.webdriver.support.ui import WebDriverWait # 导入Selenium中的等待方法。
from selenium.webdriver.support import expected_conditions as EC # 导入Selenium中的预期条件模块
from selenium import webdriver # 导入Selenium中的webdriver模块,以便打开浏览器。
# 创建一个Chrome浏览器实例并访问页面
driver = webdriver.Chrome()
driver.get("http://www.example.com")
# 等待页面加载完成
wait = WebDriverWait(driver, 10) # 创建一个WebDriverWait对象,等待最多10秒
locator = (By.ID, "myElement") # 定位元素的方式和值
element = wait.until(EC.presence_of_element_located(locator)) # 等待元素加载完成,并返回该元素
# 操作元素
element.click() # 点击该元素
6.7 等待对象.until()函数
利用from selenium.webdriver.support.ui import WebDriverWait
类创建的等待对象,可以用于等待页面中某个元素加载完成后,再进行操作。
通常配合from selenium.webdriver.support import expected_conditions as EC
条件类中的函数一起使用,用于等待页面中的某一个元素加载完成之后,再进行下一步的操作
等待对象.until()函数本质:
wait.until()
是一个高阶函数,它的参数是一个函数(或函数名),返回值是一个函数对象。在上面的例子中,我们使用EC.presence_of_element_located()
作为参数传递给了 wait.until()
,它返回一个函数对象,这个函数对象在被调用时会判断元素是否存在并返回 True
或 False
。
wait.until() 接受一个函数作为参数,它会循环调用这个函数,直到返回值为 True 或者超时时间到了为止。在每次调用函数时,wait.until() 会将 WebDriver 对象传递给函数,以便在函数中可以使用 WebDriver 对象进行元素查找和操作。这个过程也称为轮询,即不断尝试直到目标条件满足或者超时。
7. 操作鼠标
from selenium.webdriver.common.action_chains import ActionChains
Selenium提供了ActionChains
类来模拟鼠标操作。ActionChains是一种用于将多个动作链接在一起以形成更复杂操作的技术,可以模拟鼠标移动、单击、双击、拖放、键盘操作等。
下面是一个示例,模拟鼠标移动到元素上并单击它:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
# 打开浏览器并访问页面
driver = webdriver.Chrome()
driver.get("http://www.example.com")
# 找到目标元素
# 使用driver实例的find_element_by_xpath()方法查找指定路径的网页元素,并将其赋值给变量element。
element = driver.find_element_by_id("myElement")
# 模拟鼠标移动并单击
# 使用ActionChains模块创建一个鼠标动作链实例,并将其赋值给变量actions。然后,使用actions实例的move_to_element()方法将鼠标移动到指定元素上,click()方法模拟鼠标左键单击操作,最后使用perform()方法执行鼠标动作链。
actions = ActionChains(driver)
actions.move_to_element(element).click().perform()