selenium是一个web的自动化测试工具,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面
1.首先需要安装chromedriver驱动。
chromedriver是一个驱动Chrome浏览器的驱动程序,先下载驱动
下载地址:http://chromedriver.storage.googleapis.com/index.html
找到自己Chrome对应的版本,将解压后的chromedriver.exe文件放到python的根目录下即可。
2.敲代码
注意:selenium4.x的语法与老版本略有不同,我的是4.1.0
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 实例化浏览器
driver = webdriver.Chrome()
# 发送请求
url = 'https://www.baidu.com/'
driver.get(url)
# 页面的最大化
driver.maximize_window()
# 页面操作
driver.page_source # 页面源码
driver.get_cookies() # 获取cookie
driver.current_url # 当前请求的URL地址
driver.back() #后退
driver.forward() # 前进
driver.save_screenshot('img.png') # 页面截图,另存为img.png
# 定位元素,可以根据ID定位,也可以根据class_name定位,也可以使用xpath语法
driver.find_element(By.ID,'su')
driver.find_element(By.CLASS_NAME,'su')
driver.find_element(By.XPATH,'//div')
# 操作
driver.find_element(By.ID,"kw").send_keys("长城") # 输入长城
driver.find_element(By.ID,"su").click() # 点击
# 要注意,想要获取所有满足条件的元素,需要用find_elements。
行为链
#前略
# 定位百度的输入框
input = driver.find_element(By.ID,"kw")
# 定位百度按钮
btntag = driver.find_element(By.ID,"su").click()
# 实例化行为链
actions = ActionChains(driver)
# 在定位好的输入框输入内容
actions.send_keys_to_element(input,'python')
# 点击
actions.move_to_element(btntag)
actions.click()
# 执行所有存储的操作。
actions.perform()
页面等待,等待元素
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
wait = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "su"))
)
其他的等待条件
- presence_of_element_located:某个元素已经加载完毕了。
- presence_of_all_elements_located:网页中所有满足条件的元素都加载完毕了。
- element_to_be_clickable:某个元素是可以点击了。
去除识别
from selenium.webdriver import ChromeOptions
# 去除识别
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_experimental_option("detach", True)
driver = webdriver.Chrome(options=option)
driver.get('https://www.baidu.com/')
# 特征识别
script = 'Object.defineProperty(navigator, "webdriver", {get: () => false,});'
driver.execute_script(script)