Selenium 常用方法
selenium 的常用方法都是和页面元素打交道的。元素定位是在页面上定位到元素,方法则是对这些元素做一些操作。
1 基本方法
1.1 send_keys()
类似于模拟键盘输入。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# 启动谷歌浏览器
driver = webdriver.Chrome()
# 访问百度首页
driver.get("https://www.baidu.com")
# 找到input框
elem = driver.find_element(By.XPATH, "//input[@name='wd']")
# 输入字符
elem.send_keys("python")
# 回车
elem.send_keys(Keys.RETURN)
time.sleep(3)
1.2 text()
text方法用于获取文本,也就是a标签之间的文字。
elem = driver.find_element(By.LINK_TEXT, "贴吧")
print(elem.text)
1.3 get_attribute()
获取属性值。
elem = driver.find_element(By.TAG_NAME, "input")
print(elem.get_attribute("name"))
1.4 maximize_window()
最大化浏览器窗口。
driver.maximize_window()
1.5 current_window_handle()
获取当前窗口句柄
driver.current_window_handle
# 864BA5163AA8602EAF5123942319BBFA
1.6 current_url()
获取当前窗口url
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
elem = driver.find_element(By.XPATH, "//input[@name='wd']")
elem.send_keys("python")
elem.send_keys(Keys.ENTER)
print(driver.current_url)
1.7 is_selected()
判断元素是否被选择,一般用于选择框。
# 返回 True 或 False
driver.find_element(By.TAG_NAME, "select").is_selected()
1.8 is_enabled()
判断元素是否可用
# 返回 True 或 False
driver.find_element(By.TAG_NAME, "select").is_enabled()
1.9 is_displayed()
判断元素在页面中是否显示
driver.find_element(By.TAG_NAME, "select").is_displayed()
1.10 clear()
清除输入框内的内容。
elem = driver.find_element(By.XPATH, "//input[@name='wd']")
elem.clear()
1.11 quit()
关闭浏览器并杀掉 chromedriver.exe 进程。
1.12 title()
获取页面 title。一般在html文件中都有title标签。
driver.title
1.13 refresh()
刷新页面
driver.refresh()
1.14 back()
浏览器工具栏向后操作,一般是回到上一个页面
1.15 forward()
浏览器工具栏向前操作
2 特殊元素定位
2.1 鼠标悬停操作
在 selenium 中,键盘鼠标的操作封装在 ActionChains类中。该类的主要使用场景为 单击、双击、拖拽等。
- click(on_element=None), 模拟鼠标单击
- click_and_hold(on_element=None),模拟鼠标单击并且按住不放
- double_click(on_element=None), 模拟鼠标双击
- context_click(on_element=None),模拟鼠标右击操作
- drag_and_drop(source, target),模拟鼠标拖拽
- key_down(value, element=None),模拟按住某个键,实现快捷键操作
- key_up(value, element=None),模拟松开某个键,一般和key_down一起使用
- move_to_element(to_element), 模拟将鼠标移动到指定的某个页面元素
- move_to_element_with_offset(to_element, xoffset, yoffset), 移动鼠标至指定的坐标
- perform(),将之前一系列的 ActionChains 执行
- release(on_element=None),释放按下的鼠标
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com")
elem = driver.find_element(By.LINK_TEXT, "网盘")
action = ActionChains(driver)
action.move_to_element(elem).perform()
2.2 select 操作
selenium 提供了处理下拉框 select元素的方法,可以处理 select 标签。
1)select_by_index 方式
有的元素需要触发某些事件才会生成。所以我们也需要将显示select下拉框之前的操作也实现,包括移动鼠标、单击鼠标等。
se = driver.find_element(By.ID, "nr")
Select(se).select_by_index(1) # 按索引选择
2)select_by_value 方式
se = driver.find_element(By.ID, "nr")
Select(se).select_by_value ("20") # 按value值选择
3)select_by_visible_text 方式
se = driver.find_element(By.ID, "nr")
Select(se).select_by_visible_text ("每页显示20条") # 按显示的选项的文本取值
selenium 对返回选项 options 的信息,也提供了3中常用的方法。
1)options,返回 select 所有的选项
se = driver.find_element(By.ID, "nr")
Select(se).options
2)all_selected_options,返回 select 下拉框中已经选中的选项
se = driver.find_element(By.ID, "nr")
Select(se).all_selected_options
3)first_selected_option,返回第一个被选中的选项
se = driver.find_element(By.ID, "nr")
Select(se).first_selected_option
4)取消所有的选择
select.deselect_all()
2.3 alert 弹窗
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.runoob.com/try/try.php?filename=tryjs_alert")
driver.switch_to.frame("iframeResult")
# 触发弹窗
driver.find_element(By.CSS_SELECTOR, "input[value='显示警告框']").click()
# 获取弹窗对象
alert = driver.switch_to.alert
# 点击确定
alert.accept()
# 点击取消
alert.dismiss()
# 如果弹窗中有input框,则输入内容
alert.send_keys("sss")
time.sleep(5)
driver.quit()
2.4 利用 js 操作页面元素
webdriver 对部分浏览器上控件并不是直接支持的,比如说右侧滚动条。这就需要借助js来间接操作。webdriver 提供了 execute_script()和execute_async_script() 两张方式来执行 js 代码
1) execute_script()
同步执行,适合执行时间较短的js。webdriver 会等待执行结果,然后继续执行后续代码。
2)execute_async_script()
异步执行,通常执行时间比较长的js。webdriver 不需要等待执行结果,直接执行后续代码。
# 获取输入框并填值
js = "document.getElementById('kw').value='selenium'"
driver.execute_script(js)
window.scrollTo(100, 200) // 滚动条滑到指定的位置
window.scrollTo(0, document.body.scrollHeight) // 滑到底部
2.5 利用 jQuery 操作页面元素
# 获取输入框并填值
jq = "$('#kw').val('selenium')"
driver.execute_script(jq)
jq = "$('#su').click()"
driver.execute_script(jq)
2.6 常用的鼠标事件
ActionChains(driver).move_to_element(elem).perform()
ActionChains(driver).context_click(elem).perform()
ActionChains(driver).double_click(elem).perform()
ActionChains(driver).drag_and_drop(elem01, elem02).perform()
2.7 常用的键盘事件
Keys.BACK_SPACE: 删除键
Keys.SPACE: 空格键
Keys.TAB: Tab键
Keys.ESCAPE: 回退键
Keys.ENTER: 回车键
Keys.CONTROL, "a": 组合键 ctrl + A
Keys.CONTROL, "x": 组合键 ctrl + X
Keys.CONTROL, "v": 组合键 ctrl + V
Keys.CONTROL, "c": 组合键 ctrl + C
Keys.F1: F1 键
Keys.F12: F12 键
3 Frame 操作
frame 标签有 Frameset、Frame和IFrame 三种。Frameset 可以直接定位。 Frame 和 iFrame 的定位方法相同,需要先切换到 Frame 内再进行操作。
# 切换到name为 login_frame 的Frame内
driver.switch_to.frame("login_frame")
# 切换到内部后,只能对Frame内部元素进行操作,如果需要对Frame之外的元素进行操作,则需要返回驱动
driver.switch_to.default_content()
# 通过 index 定位, 0 表示第一个的意思
driver.switch_to.frame(0)
# 通过 IFrame name属性定位
driver.switch_to.frame("login_frame")
# 通过 WebElement 对象模式,也就是用 find_element 方法获取元素对象
driver.switch_to.frame(driver.find_element(By.ID, "login_frame"))
4 上传附件
如果是 input 类型的标签,并且 type 值为 “file”, 那么直接通过 send_keys 的方式来绕过弹出框操作,直接将文件路径信息传递给"添加附件"按钮
driver.find_element(By.NAME, 'UploadFile').send_keys("真实文件路径")
5 cookie
webdriver 提供了以下方法来操作 cookie