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(),它返回一个函数对象,这个函数对象在被调用时会判断元素是否存在并返回 TrueFalse
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()