selenium用法总结,前面的博客也有写,知识在爬虫这块总结下:
from selenium import webdriver
# 要想调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys import Keys
# 调用环境变量指定的Chrome浏览器创建浏览器对象
driver = webdriver.Chrome()
# get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 time.sleep(2)
driver.get("http://www.baidu.com/")
# 获取页面名为 wrapper的id标签的文本内容
data = driver.find_element_by_id("wrapper").text
# 打印数据内容
print(data)
# 打印页面标题 "百度一下,你就知道"
print(driver.title)
# 生成当前页面快照并保存
driver.save_screenshot("baidu.png")
# id="kw"是百度搜索输入框,输入字符串"长城"
driver.find_element_by_id("kw").send_keys("长城")
# id="su"是百度搜索按钮,click() 是模拟点击
driver.find_element_by_id("su").click()
# 获取新的页面快照
driver.save_screenshot("长城.png")
# 打印网页渲染后的源代码
print(driver.page_source)
# 获取当前页面Cookie
print(driver.get_cookies())
# ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,‘a‘)
# ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,‘x‘)
# 输入框重新输入内容
driver.find_element_by_id("kw").send_keys("itcast")
# 模拟Enter回车键
driver.find_element_by_id("su").send_keys(Keys.RETURN)
# 清除输入框内容
driver.find_element_by_id("kw").clear()
# 生成新的页面快照
driver.save_screenshot("baidu.png")
# 获取当前url
print(driver.current_url)
# 关闭当前页面,如果只有一个页面,会关闭浏览器
# driver.close()
# 关闭浏览器
driver.quit()
页面操作
Selenium 的 WebDriver提供了各种方法来寻找元素,假设下面有一个表单输入框:
<input type="text" name="user-name" id="passwd-id" />
# 获取id标签值
element = driver.find_element_by_id("passwd-id")
# 获取name标签值
element = driver.find_element_by_name("user-name")
# 获取标签名值
element = driver.find_elements_by_tag_name("input")
# 也可以通过XPath来匹配
element = driver.find_element_by_xpath("//input[@id=‘passwd-id‘]")
定位UI元素 (WebElements)
关于元素的选取,有如下的API 单个元素选取或者多个元素的选取,带elements的都是多个元素的,返回的是list
find_element_by_id find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector
下面是各种选择器的用法
#id选择器
element = driver.find_element_by_id("coolestWidgetEvah")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
element = driver.find_element(by=By.ID, value="coolestWidgetEvah")
#Class 选择器
cheeses = driver.find_elements_by_class_name("cheese")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
cheeses = driver.find_elements(By.CLASS_NAME, "cheese")
#标签选择器
frame = driver.find_element_by_tag_name("iframe")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
frame = driver.find_element(By.TAG_NAME, "iframe")
#name属性选择
cheese = driver.find_element_by_name("cheese")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.NAME, "cheese")
#超链接的文字选择
#<a href=‘http://www.nnzhp.cn‘>牛牛博客<a>
heese = driver.find_element_by_link_text("牛牛博客")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.LINK_TEXT, "牛牛博客")
#超链接部分文字选择,上面那个是全部的文字一样才可以,这个只是一部分就ok了
# <a href=‘http://www.nnzhp.cn‘>牛牛博客<a>
cheese = driver.find_element_by_partial_link_text("牛牛")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.PARTIAL_LINK_TEXT, "牛牛")
#css选择器
cheese = driver.find_element_by_css_selector("#food span.dairy.aged")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.CSS_SELECTOR, "#food span.dairy.aged")
#xpath选择器
inputs = driver.find_elements_by_xpath("//input")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
inputs = driver.find_elements(By.XPATH, "//input")
鼠标动作链
有些时候,我们需要再页面上模拟一些鼠标操作,比如双击、右击、拖拽甚至按住不动等,我们可以通过导入 ActionChains 类来做到:
#导入 ActionChains 类
from selenium.webdriver import ActionChains
# 鼠标移动到 ac 位置
ac = driver.find_element_by_xpath(‘element‘)
ActionChains(driver).move_to_element(ac).perform()
# 在 ac 位置单击
ac = driver.find_element_by_xpath("elementA")
ActionChains(driver).move_to_element(ac).click(ac).perform()
# 在 ac 位置双击
ac = driver.find_element_by_xpath("elementB")
ActionChains(driver).move_to_element(ac).double_click(ac).perform()
# 在 ac 位置右击
ac = driver.find_element_by_xpath("elementC")
ActionChains(driver).move_to_element(ac).context_click(ac).perform()
# 在 ac 位置左键单击hold住
ac = driver.find_element_by_xpath(‘elementF‘)
ActionChains(driver).move_to_element(ac).click_and_hold(ac).perform()
# 将 ac1 拖拽到 ac2 位置
ac1 = driver.find_element_by_xpath(‘elementD‘)
ac2 = driver.find_element_by_xpath(‘elementE‘)
ActionChains(driver).drag_and_drop(ac1, ac2).perform()
处理下拉框
我们已经知道了怎样向文本框中输入文字,但是有时候我们会碰到<select> </select>标签的下拉框。直接点击下拉框中的选项不一定可行。
Selenium专门提供了Select类来处理下拉框。 其实 WebDriver 中提供了一个叫 Select 的方法,可以帮助我们完成这些事情:
# 导入 Select 类
from selenium.webdriver.support.ui import Select
# 找到 name 的选项卡
select = Select(driver.find_element_by_name(‘status‘))
select.select_by_index(1)#根据索引
select.select_by_value("0")#根据value
select.select_by_visible_text("未审核")
select.deselect_all()#取消选择
弹窗处理
当你触发了某个事件之后,页面出现了弹窗提示,处理这个提示或者获取提示信息方法如下:
alert = driver.switch_to_alert()
页面切换、页面前进和后退
一个浏览器肯定会有很多tab页,所以我们肯定要有方法来实现窗口的切换。切换窗口的方法如下:
driver.switch_to.window("this is window name")
#也可以使用 window_handles 方法来获取每个tab页的操作对象
for handle in driver.window_handles:
driver.switch_to_window(handle)
driver.forward() #前进
driver.back() # 后退
操作Cookies
#获取页面每个Cookies值
for cookie in driver.get_cookies():
print ("%s -> %s" % (cookie[‘name‘], cookie[‘value‘]))
#删除Cookies
# By name
driver.delete_cookie("CookieName")
# all
driver.delete_all_cookies()
页面等待
页面等待非常重要,因为我们在打开一个网站的时候,由于网速或者其他原因,页面没有加载全,这时候可能咱们想要找的元素还没有出现,运行代码的时候就会报错了。找不到该元素。
为了避免这种情况的出现,selenium里面有2种等待元素加载完成的方式,一种是隐式等待,一种是显示等待。前者就比较傻瓜了,就是固定等一个时间,过了时间就继续执行下面的代码,和sleep差不多。后者是指定一个最长的等待时间,在这个时间内它会一直检查这个元素有没有被加载出来,如果被加载出来,那么就不等待了,继续执行;如果超过最长的等待时间,那么就会抛出异常。
显示等待
from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverWait 库,负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
# expected_conditions 类,负责条件出发
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://www.xxxxx.com/loading")
try:
# 页面一直循环,直到 id="myDynamicElement" 出现
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
如果不写参数,程序默认会 0.5s 调用一次来查看元素是否已经生成,如果本来元素就是存在的,那么会立即返回。
下面是一些内置的等待条件,你可以直接调用这些条件,而不用自己写某些等待条件了
title_is #标题是xx
title_contains #标题包含xx
presence_of_element_located #元素是否被加载
visibility_of_element_located #元素是否被加载,可见代表元素可显示且宽和高都大于0
visibility_of #判断元素是否可见
presence_of_all_elements_located #判断是否至少有1个元素被加载,如果定位到就返回列表
text_to_be_present_in_element #判断指定的元素中是否包含了预期的字符串,返回布尔值
text_to_be_present_in_element_value#判断指定元素的属性值中是否包含了预期的字符串,返回布尔值
frame_to_be_available_and_switch_to_it#判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False
invisibility_of_element_located #判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素
element_to_be_clickable #元素可以点击
staleness_of #等待某个元素从dom树中移除
element_to_be_selected #判断某个元素是否被选中了,一般用在下拉列表‘
element_located_to_be_selected #一个期望的元素位于被选中
element_selection_state_to_be #判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be #期望找到一个元素并检查是否选在状态
alert_is_present # 预期一个警告信息
隐式等待
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # seconds
driver.get("http://www.xxxxx.com/loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
原文:https://www.cnblogs.com/wxcx/p/12906394.html