- Selenium中常用的第三方模块
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains # 动作链
from selenium.webdriver.common.keys import Keys # 键盘操作
from selenium.common import exceptions # 异常处理
- 禁用显示“Chrome 正在受到自动软件的控制”信息栏
options = ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
- 禁用显示自动化扩展程序提示框
options.add_experimental_option('useAutomationExtension', False)
- 禁止显示保存密码提示框
prefs = {"credentials_enable_service": False, "profile.password_manager_enabled": False}
options.add_experimental_option("prefs", prefs)
- 禁用自动化控制特性,避免被网站检测到
options.add_argument('--disable-blink-features=AutomationControlled')
- 无头浏览器
options.add_argument('--headless') # 设置无头模式
options.add_argument('--disable-gpu') # 禁用GPU加速
- 避免被浏览器检测出来使用了Selenium
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
- 修改浏览器中的navigator对象,使网站检测不到Selenium
script = 'Object.defineProperty(navigator,"webdriver",{get:() => false,});'
driver.execute_script(script)
- 禁用图片加载
prefs = {"profile.managed_default_content_settings.images": 2}
options.add_experimental_option("prefs", prefs)
- 全部代码执行完后,指定浏览器仍保持打开状态
options.add_experimental_option("detach", True)
- 滚动条滚到最底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 或者下面这句也一样
# driver.execute_script('document.documentElement.scrollTop = document.documentElement.scrollHeight')
- 将当前上下文切换到指定的iframe或frame中
# 切换到指定iframe或frame中
driver.switch_to.frame(frame_reference) # frame_reference可以是iframe或frame的索引或id、name属性
......
......
# 切换回主文档
driver.switch_to.default_content()
- 浏览器切换到最新打开的窗口
driver.switch_to.window(driver.window_handles[-1])
- 浏览器切换到第一个打开窗口
driver.switch_to.window(driver.window_handles[0])
- 滑块操作
# 定位滑块
slider = driver.find_element(By.ID, 'nc_1_n1z')
# 实例化动作链
action = ActionChains(driver)
# 点击且长按该滑块
action.click_and_hold(slider).perform()
# 用一个for循环进行拖动
for i in range(5):
action.move_by_offset(70, 0).perform() # 向右拖动,一次拖动70个像素点
sleep(0.3)
action.pause(0.5).release().perform() # 停顿0.5秒后释放鼠标
- 通过JavaScript代码实现点击操作(如果直接点击会报错时就推荐用这种)
# 定位要点击的元素
clic = li.find_element(By.CSS_SELECTOR, '.job-card-left')
# 执行点击操作
driver.execute_script('arguments[0].click()', clic)
- 键盘回车
# 找到某个文本框元素
input_box = driver.find_element_by_xpath("//input[@name='input-box']")
# 在文本框中输入文本,然后按下回车键
input_box.send_keys("Hello, World!")
input_box.send_keys(Keys.RETURN)
后续会继续补充…