Selenium的使用

507 阅读7分钟

安装

pip install selenium
浏览器地址
Edgedeveloper.microsoft.com/en-us/micro…
Firefoxgithub.com/mozilla/gec…
Safariwebkit.org/blog/6900/w…
Chrome(113之前)CNPM Binaries Mirror (npmmirror.com)
Chrome(113之后)CNPM Binaries Mirror

Selenium4中,webdriver.Chrome的初始化方法不再接受executable_path参数来指定Chrome WebDriver的路径。会自动下载驱动。

使用本地浏览器

找到本地浏览器

image.png

这只是快捷方式,通过右键属性查看具体位置。

image.png

命令行启动本地浏览器

启动前确保其他Chrome实例都关闭

cd C:\Program Files\Google\Chrome\Application
chrome.exe --remote-debugging-port=9222

使用selenium调用

from selenium import webdriver
from scrapy.selector import Selector
from selenium.webdriver.common.by import By

browser_options = webdriver.ChromeOptions()
# 这段代码用于启用 Chrome 浏览器的调试功能,并将调试器的地址设置为 127.0.0.1:9222
browser_options.add_experimental_option('debuggerAddress', '127.0.0.1:9222')
# 启动浏览器
browser = webdriver.Chrome(options=browser_options)
browser.get('https://juejin.cn/')

option配置

from selenium import webdriver
from scrapy.selector import Selector
from selenium.webdriver.common.by import By

browser_options = webdriver.ChromeOptions()

#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')


# 设置代理ip(会和启动本地浏览器冲突)
options.add_argument(f'--proxy-server=http://{proxy_ip}')

# 添加无头选项 
options.add_experimental_option('detach', True)


# 启动浏览器
browser = webdriver.Chrome(options=browser_options)
browser.get('https://juejin.cn/')

使用

ChromeOptions

from selenium import webdriver

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)
browser.get('https://juejin.cn/')

页面基本属性

from selenium import webdriver
from scrapy.selector import Selector
from selenium.webdriver.common.by import By
import time

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(2)


# 网页标题
print(browser.title)
# 当前网址
print(browser.current_url)
# 浏览器名称
print(browser.name)
# 网页源码
print(browser.page_source)

get

访问页面

from selenium import webdriver

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)
browser.get('https://juejin.cn/')

set_window_size

set_window_size()方法可以用来设置浏览器大小(就是分辨率),而maximize_window则是设置浏览器为全屏。

from selenium import webdriver
from scrapy.selector import Selector
import time

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

# 设置浏览器大小:全屏
browser.maximize_window()


browser.get('https://juejin.cn/')
time.sleep(2)

# 设置分辨率 500*500
browser.set_window_size(500,500)
time.sleep(2)

# 设置分辨率 1000*800
browser.set_window_size(1000,800)

refresh

刷新页面

from selenium import webdriver
from scrapy.selector import Selector
import time

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(2)

browser.refresh()

前进后退

forward()方法可以用来实现前进,back()可以用来实现后退。

from selenium import webdriver
from scrapy.selector import Selector
import time

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(2)

# 打开淘宝页面
browser.get(r'https://www.baidu.com')
time.sleep(2)

# 后退到掘金页面
browser.back()
time.sleep(2)

# 前进的百度页面
browser.forward()

find_element的By定位

# 使用前先导入By类
from selenium.webdriver.common.by import By
browser.find_element(By.ID,'kw')
browser.find_element(By.NAME,'wd')
browser.find_element(By.CLASS_NAME,'s_ipt')
browser.find_element(By.TAG_NAME,'input')
browser.find_element(By.LINK_TEXT,'新闻')
browser.find_element(By.PARTIAL_LINK_TEXT,'闻')
browser.find_element(By.XPATH,'//*[@id="kw"]')
browser.find_element(By.CSS_SELECTOR,'#kw')
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

browser_options = webdriver.ChromeOptions()

browser_options.add_argument('--disable-extensions')
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')

browser = webdriver.Chrome(options=browser_options)
browser.wait = WebDriverWait(browser, 20)
browser.get('https://juejin.cn/')
time.sleep(5)


print(browser.find_element(By.XPATH, '//button[@class="login-button"]'))

find_elements

如果定位的目标元素在网页中不止一个,那么则需要用到find_elements,得到的结果会是列表形式,其他操作一致。

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(2)

print(browser.find_elements(By.CLASS_NAME, 'nav-item-wrap'))

get_attribute获取属性

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(2)

# https://lf3-cdn-tos.bytescm.com/obj/static/xitu_juejin_web/e08da34488b114bd4c665ba2fa520a31.svg
print(browser.find_element(By.CLASS_NAME, 'logo-img').get_attribute('src'))

# 获取源码
print(browser.find_element(By.XPATH, '//div[@class="custom-tbody"]').get_attribute('innerHTML'))

获取文本

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(2)

# 登录
# 注册
print(browser.find_element(By.CLASS_NAME, 'login-button').text)

其他属性

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(2)

# {'x': 1361, 'y': 12}
print(browser.find_element(By.CLASS_NAME, 'login-button').location)
# {'height': 36, 'width': 95}
print(browser.find_element(By.CLASS_NAME, 'login-button').size)

输入文本

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(2)

browser.find_element(By.XPATH,'//input[@class="search-input isResourceVisible"]').send_keys('yhq')

点击

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(2)

browser.find_element(By.XPATH,'//div[@class="login-button-wrap"]').click()

清空文本

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(2)

browser.find_element(By.XPATH,'//input[@class="search-input isResourceVisible"]').clear()

回车确认

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(2)

browser.find_element(By.XPATH,'//div[@class="xxxxx"]').submit()

下拉框

# 使用前先导入Select类
from selenium.webdriver.support.select import Select
'''1、三种选择某一选项项的方法'''

select_by_index()           # 通过索引定位;注意:index索引是从“0”开始。
select_by_value()           # 通过value值定位,value标签的属性值。
select_by_visible_text()    # 通过文本值定位,即显示在下拉框的值。

'''2、三种返回options信息的方法'''

options                     # 返回select元素所有的options
all_selected_options        # 返回select元素中所有已选中的选项
first_selected_options      # 返回select元素中选中的第一个选项


'''3、四种取消选中项的方法'''

deselect_all                # 取消全部的已选择项
deselect_by_index           # 取消已选中的索引项
deselect_by_value           # 取消已选中的value值
deselect_by_visible_text    # 取消已选中的文本值

模拟鼠标

# 使用前先导入ActionChains类
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(browser):调用ActionChains()类,并将浏览器驱动browser作为参数传入
perform():执行ActionChains()中储存的所有操作,可以看做是执行之前一系列的操作

右键

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.action_chains import ActionChains

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(2)

right_click = browser.find_element(By.XPATH,'//div[@class="login-button-wrap"]')
ActionChains(browser).context_click(right_click).perform()

双击

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.action_chains import ActionChains

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(2)

right_click = browser.find_element(By.XPATH,'//div[@class="login-button-wrap"]')
ActionChains(browser).double_click(right_click).perform()

悬停

import time

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(5)

elem = browser.find_element(By.CLASS_NAME, 'more')
# 获取元素当前位置坐标
elem_location = elem.location
print(elem_location)
elem_locationX = int(elem_location['x'])
elem_locationY = int(elem_location['y'])

# 悬停
ActionChains(browser).move_to_element(elem).perform()

拖拽

import time

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')
time.sleep(5)

start = browser.find_element(By.CLASS_NAME, 'logo-img')
start_loc = start.location

# 悬停
ActionChains(browser).drag_and_drop_by_offset(start, start_loc['x'] + 100, start_loc['y'] + 100).perform()

显示等待

设置一个等待时间和一个条件,在规定时间内,每隔一段时间查看下条件是否成立,如果成立那么程序就继续执行,否则就抛出一个超时异常。

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

driver: 浏览器驱动

timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)

poll_frequency: 每次检测的间隔时间,默认是0.5秒

ignored_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常
until(method,message='')

method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False

message: 如果超时,抛出TimeoutException,将message传入异常
until_not(method,message='')

until_not 与until相反,until是当某元素出现或什么条件成立则继续执行,until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。
import time
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait


browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')

 # 等待页面加载完成
WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.item-box')))

运行JavaScript

import time
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)

browser.get('https://juejin.cn/')

time.sleep(5)

browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("yhq")')

close

关闭浏览器当前页面

from selenium import webdriver

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)
browser.get('https://juejin.cn/')

browser.close()

quit

关闭浏览器全部页面

from selenium import webdriver

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=browser_options)
browser.get('https://juejin.cn/')

browser.quit()

mouse

安装

$ pip install mouse

使用

move

from selenium import webdriver
from scrapy.selector import Selector
from selenium.webdriver.common.by import By
from mouse import move

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
# 启动浏览器
browser = webdriver.Chrome(options=browser_options)
browser.get('https://www.zhihu.com/signin')

# 选择登录方式
browser.find_element(By.XPATH, '//div[@class="SignFlow-tab"]').click()
#  输入账号密码
browser.find_element(By.NAME, 'username').send_keys('15284374543')
browser.find_element(By.NAME, 'password').send_keys('YHQzh1026')
# 点击登录
# browser.find_element(By.XPATH, '//button[@type="submit"]').click()
move(1028, 567)

click

from selenium import webdriver
from scrapy.selector import Selector
from selenium.webdriver.common.by import By
from mouse import move, click

browser_options = webdriver.ChromeOptions()
#关闭自动控制blink特征
options.add_argument('--disable-blink-features=AutomationControlled')
# 启动浏览器
browser = webdriver.Chrome(options=browser_options)
browser.get('https://www.zhihu.com/signin')

# 选择登录方式
browser.find_element(By.XPATH, '//div[@class="SignFlow-tab"]').click()
#  输入账号密码
browser.find_element(By.NAME, 'username').send_keys('15284374543')
browser.find_element(By.NAME, 'password').send_keys('YHQzh1026')
# 点击登录
# browser.find_element(By.XPATH, '//button[@type="submit"]').click()
move(1028, 567)
click()