Python-selenium(web自动化工具)笔记
Selenium 是一个用于Web应用程序测试的工具。
1. 准备工作
1.1. 安装
pip install selenium
1.2. 下载浏览器驱动
Chrome浏览器驱动:chromedriver
下载对应的浏览器版本的驱动,放到python安装路径的根目录即可使用
1.3. 测试
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('www.baidu.com')
2. 基础知识
2.1. 元素定位
driver.find_element_by_xpath() # 推荐使用xpath 几乎满足所有需求
driver.find_element_by_class_name() # 比较常用
# 当class的属性有多个时,多使用下面这个,属性以点'.'代替空格进行分割
driver.find_element_by_css_selector()
# 以下看情况使用
driver.find_element_by_id()
driver.find_element_by_name()
driver.find_element_by_tag_name()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text()
element
表示只找第一个满足条件的元素
elements
表示找到所有满足条件的元素,返回列表,常用于获取ul
下所有的li
标签
2.1.1. 元素大小
driver.find_element_by_xpath('//div').size
#返回值
{'height': 18, 'width': 48}
2.1.3. 元素中的文本
driver.find_element_by_xpath('//div').text
2.1.4. 元素的属性
driver.find_element_by_xpath('//div')get_attribute('href')
2.2. 页面交互
2.2.1. 输入
如:
<input type="text" name="passwd" id="passwd-id" />
通过元素定位,往input
标签内输入文字
driver.find_element_by_name('passwd').send_keys('文本')
2.2.2. 点击
如:点击提交按钮
driver.find_element_by_name('submit').click()
当a
标签无法点击时,使用如下方法:
- 方法一:
from selenium.webdriver.common.keys import Keys
driver.find_element_by_name('submit').send_keys(Keys.ENTER)
- 方法二:
#使用js语法
document.getElementById("xxx") # id获取元素,xxx表示id值
document.getElementByClassName("xxx") # class获取元素,xxx表示class值
document.getElementByName("xxx") #name获取元素,xxx表示name值
document.getElementByTagName("xxx") # 获取tag标签,xxx表示tag值
document.querySelectorAll("xxx") # css获取元素,xxx表示css语法
document.getElementById("xxx").click() # 点击元素,元素后直接click()即可
#例如:
js ='document.getElementById("password").click()' # js点击元素
driver.execute_scrtip(js)
2.2.3. 下拉框
element = driver.find_element_by_xpath("//select[@name='name']")
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
print("Value is: %s") % option.get_attribute("value")
option.click()
2.2.4. 取消选中
select = Select(driver.find_element_by_id('id'))
select.deselect_all()
2.2.5. 获取选项列表
select = Select(driver.find_element_by_xpath("xpath"))
all_selected_options = select.all_selected.options
2.2.6. 获取所有可用的选项
options = select.options
2.3. 拖放 ——通常可以用于滑块验证码
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element,target).perform()
2.4. 切换switch
2.4.1. 切换窗口
num = driver.window_handles # 获取窗口,返回列表
alert = driver.switch_to_window(num['']) # 切换到指定的窗口
2.4.2. 弹出式对话框
alert = driver.switch_to_alert()
2.4.2.1. 确认
driver.switch_to_alert().accept()
2.4.2.1. 取消
driver.switch_to_alert().dimiss()
2.4.2.1. 输入
driver.switch_to_alert().send_keys()
2.4.3 切换frame框架内
driver.switch_to_frame('frameName')
如果在元素无法定位时,就需要关注元素是否在frame框架内,使用上面方法切换到frame框架之后再定位。
2.5. 调用js代码
driver.excute_script(js)
2.5.1. 滑动滚动条
# 顶部
js = "var q=document.documentElement.scrollTop=0"
driver.execute_script(js)
# 向下滑动200像素
js = 'window.scrollBy(0,200)'
driver.excute_script(js)
常用
1.无界面模式
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless') # 无头
options.add_argument('--disable-gpu') # 规避bug
driver = webdriver.Chrome(options=options)
2. 防检测
在开发者工具的Console选项卡中查询window.navigator.webdriver
,当这个值变成undefined
表示成功
2.1. 只适用于较老版本
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)
2.2. 适用于新版本
from selenium import webdriver
# 加入下面两个实验选项,达到更完美的效果
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options)
# 关键代码
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
这里我们是通过命令,使Chrome浏览器打开时先执行给定的这段代码,然后才运行网站自带的js
代码
注意:只能在第一个打开的窗口内有效,如果打开另外的窗口将无法隐藏