目录[-]

实例化方法

from selenium import webdriver
driver = webdriver.Chrome(executable_path='C:\Program Files (x86)\Google\Chrome\Application\chromedriver')

浏览器操作

  • 浏览器最大化
driver.maximize_window()
  • 设置浏览器宽高
driver.set_window_size(480, 800)
  • 控制浏览器前进后退
driver.back() 
driver.forward()

简单对象定位

get_element_by_id()  # id
get_element_by_name()  # name
get_element_by_class_name()  # class_name
get_element_by_tag_name()  # tag_name
get_element_by_link_text()  # link_text
get_element_by_partial_link_text()  #  部分link_text
get_element_by_xpath()  # xpath定位
get_element_by_link_text()  # link_text
find_element_by_css_selector()  # css定位

操作Element对象

find_element_by_id("user_name").clear()  # 清楚元素内容
find_element_by_id("user_name").send_keys("username")  # 按键输入
find_element_by_id("dl_an_submit").click()  # 单机元素
find_element_by_id("dl_an_submit").submit()  # 提交表单
  • Element常用方法
driver.find_element_by_name('tj_trnews').size  # 元素尺寸
driver.find_element_by_name('tj_trnews').text  # 返回元素文本
driver.find_element_by_name('tj_trnews').get_attribute('class')  # 获取属性值
driver.find_element_by_name('tj_trnews').is_displayed()  # 是否用户可见

鼠标事件

from selenium.webdriver.common.action_chains import ActionChains

 el = driver.find_element_by_name('tj_trnews')  # 目标元素

ActionChains(driver).context_click(el).perform()  # 右击目标元素
ActionChains(driver).double_click(el).perform()  # 双击目标元素

source = driver.find_element_by_id('lg')   # 目标元素原始位置
target = driver.find_element_by_id('kw')  # 拖动的目标位置
ActionChains(driver).drag_and_drop(source, target).perform()  # 拖动元素

ActionChains(driver).move_to_element(el).perform()  # 鼠标移动的目标元素上
ActionChains(driver).click_and_hold(el).perform()  # 移动到目标元素按下鼠标左键

键盘事件

from selenium.webdriver.common.keys import Keys

driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("selenium")  # 输入框输入内容
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)  # 从后删除一个字符(删除键)
driver.find_element_by_id("kw").send_keys(Keys.SPACE)  # 输入空格
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')  # ctrl + a 全选输入框内容 
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')  # ctrl + x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')  # ctrl + v 粘贴
driver.find_element_by_id("su").send_keys(Keys.ENTER)  # 回车

设置等待时间

有时候网页加载比较慢,如果程序没有等待就可能出现定位不到的情况。

  • 强制等待sleep() 强制等待比较暴力,调用time模块的sleep()方法强制让程序等待。

  • 隐性等待implicitly_wait() iimplicitly_wait()是设置了最大等待时间,如果在规定时间内加载完成,则继续执行下面操作,否则一直等到时间截止再执行下一步。但是这种也有一个弊端,那就如果你需要的元素已经加载出来了,但是页面整体还没有加载完成,程序也会一直等待,也并不智能。

  • 显性等待WebDriverWait() 它是需要传入一个判断条件的匿名函数,每隔一段时间去判断条件函数,如果条件成立则继续下一步,如果不成立则继续等待。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")

# 强制等待
time.sleep(5)

# 隐形等待
driver.implicitly_wait(30)

# 显性等待
element=WebDriverWait(driver, 10).until(lambda driver:driver.find_element_by_id("kw"))  # 当找到id为kw的元素时才执行下一步。超时时间为10秒,默认每0.5秒检测一次。

定位frame中的对象

对于frame嵌套的网站,一般只能操作外层的元素,如果需要进入frame内层就需要调用switch_to.frame()方法。

driver.switch_to.frame()
frame方法接收三种参数:frame name、index 和webelement
driver.switch_to.frame('frame_name')
driver.switch_to.frame(1)
driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])

多窗口切换

要想在多个窗口之间切换,首先要获得每一个窗口的唯一标识符号(句柄)。通过获得的句柄来区别分不同的窗口,从而切换不同窗。

driver.get("http://example.com")  # 打开一个窗口
now_handle = drvier.current_window_handle  # 获取当前窗口句柄

driver.find_element_by_name('example').click()  # 点击某个元素打开新的窗口(target="_black"的元素)
all_handle = drvier.window_handles  # 获取所有窗口句柄
drvier.switch_to.window(now_handle)  # 切换为第一窗口
driver.close()  # 关闭当前窗口

下拉框处理

webdriver处理下拉框首先定位到下拉框内容,然后click某个option即可

m=driver.find_element_by_id("ShippingMethod")  # 首先定位到下拉框
m.find_element_by_xpath("//option[@value='10.69']").click()  # 然后点击下拉框选项

执行JavaScrapt

driver.execute_script('Java Scrapt Code')

# 例如下拉浏览器滚动条
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')

Cookie处理

webdriver可以对cookie进行读取、增加、删除

get_cookies()   # 获得所有 cookie 信息
get_cookie(name)   # 返回特定 name 有 cookie 信息
add_cookie(cookie_dict)   # 添加 cookie,必须有 name 和 value 值
delete_cookie(name)   # 删除特定(部分)的 cookie 信息
delete_all_cookies()   # 删除所有 cookie 信息