Selenium使用

之前有整理过Selenium的使用,这里重新用python整理一下

对象选择

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
'''
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
'''
input_first = browser.find_element(By.ID, 'q')
browser.close()

节点交互

1
2
3
4
# 节点交互
input_first.click()
input_first.send_keys('111') # 输入字符
input_first.clear() # 清空内容

动作链

1
2
3
4
5
6
7
8
9
10
11
# 比如说模拟鼠标拖拽,键盘按键等
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element(By.CSS_SELECTOR, '#draggable')
target = browser.find_element(By.CSS_SELECTOR, '#droppable')
actions = ActionChains(browser)
# drag_and_drop从来源处拖拽到目标处
actions.drag_and_drop(source, target)
# 执行动作
actions.perform()

更多动作链

运行JavaScript

1
2
3
browser.get('https://www.zhihu.com/explore')
# 将进度条下拉到最底部
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

获取节点信息

1
2
3
4
5
6
7
8
9
10
11
12
logo = browser.find_element(By.CLASS_NAME, 'logo-image')
# 获取src的属性值
logo.get_attribute('src')
# 获取文本值
logo.text
print(input.id)
# 获取节点在页面的相对位置
print(input.location)
# 获取标签名称
print(input.tag_name)
# 获取节点大小宽高
print(input.size)

切换Frame

如果网页中存在iframe节点,Selenium默认是在父Frame中操作的,如果需要定位到子Frame中,需要使用switch_to.frame方法

1
2
3
# <iframe frameborder="0" id="iframeResult" style="height: 245.48px;"></iframe>
# 定位到id为iframeResult的子frame
browser.switch_to.frame('iframeResult')

延时等待

  • 隐式等待
1
2
3
4
# 因为一些js加载、ajax加载速度的原因,所以如果网页框架加载结束立马获取源代码结果会不完整,所以必要时需要等待
# 隐式等待
# Selenium在DOM中没有找到节点,将继续等待,10s后如果还是没有该节点,则抛出异常
browser.implicitly_wait(10)
  • 显式等待
1
2
3
4
5
6
7
8
9
10
browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
# 指定最长等待时间10s
wait = WebDriverWait(browser, 10)
# presence_of_element_located代表节点出现
# 如果节点ID为q的节点在10s内成功加载出来了,获取对象
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
# element_to_be_clickable代表按钮可点击
# 如果10s内该元素是可点击的,获取对象
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))

前进、后退

1
2
browser.back()
browser.forward()
1
2
3
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'})
browser.get_cookies()
browser.delete_all_cookies()

网页标签页切换

1
2
3
4
5
6
7
8
9
10
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
# ['CDwindow-7C91693FD75DDA104028F98A7B790D87', 'CDwindow-8F0FAA9F0D48DBA6570BDCB48CADF79B']
print(browser.window_handles)
# 切换到新建的页面
browser.switch_to.window(browser.window_handles[1])
browser.get('https://www.taobao.com')
# 切换到最开始的页面
browser.switch_to.window(browser.window_handles[0])
browser.get('https://python.org')

反屏蔽

网站通过检测window.navigator对象中是否包含webdriver属性来判断请求是否来自于Selenium

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from selenium import webdriver
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
# 'chrome正受到自动测试软件的控制'提示去除
option.add_experimental_option('useAutomationExtension', False)
browser = webdriver.Chrome(options=option, executable_path='/Users/keeep/Downloads/tool/chromedriver')
# 执行js代码 将navigator对象中webdriver属性置空
# 普通执行js方法 execute_script 是在页面加载之后才调用,此处达不到效果
# browser.execute_script('Object.defineProperty(navigator, "webdriver", {get: () => undefined})')
# 采用CDP方法 Page.addScriptToEvaluateOnNewDocument 实现在每个页面刚加载的时候去执行js语句,有效果
browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
browser.get('https://antispider1.scrape.center')

无头模式

1
2
3
4
5
6
7
8
option = ChromeOptions()
option.add_argument('--headless')
browser = webdriver.Chrome(options=option)
# 使用无头模式下,建议设置下窗口大小
browser.set_window_size(1366, 768)
browser.get('https://www.baidu.com')
# 输出页面截图
browser.get_screenshot_as_file('preview.png')

用户数据持久化

1
2
3
4
5
# 设置user-data-dir参数路径,这样之前登陆过的信息就会保存在此路径下,下次打开页面在cookie不过期的前提下可直接登录
option = ChromeOptions()
option.add_argument("--user-data-dir=/Users/keeep/Downloads/tool/userDataDir")
browser = webdriver.Chrome(options=option, executable_path='/Users/keeep/Downloads/tool/chromedriver')
browser.get('https://www.taobao.com/')
赏个🍗吧
0%