Selenium(十):用By定位元素、鼠标事件、键盘事件

1. 用By定位元素

除了前面介绍的单位方法,WebDriver还提供了另一套写法,即统一调用find_element()方法,经过By来声明定位的方法,而且传入对应定位方法的定位参数。具体以下:web

from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By

wd = webdriver.Chrome()

wd.get('https://www.baidu.com/')

wd.find_element(By.ID,"kw")
wd.find_element(By.NAME,"wd")
wd.find_element(By.CLASS_NAME,"s_ipt")
wd.find_element(By.TAG_NAME,"input")
wd.find_element(By.LINK_TEXT,u"新闻")
wd.find_element(By.PARTIAL_LINK_TEXT,u"")
wd.find_element(By.XPATH,"//*[@class='bg s_btn']")
wd.find_element(By.CSS_SELECTOR,"span.bg.s_btn_wr>input#su")

find_element()方法只用于定位元素。它须要两个参数,第一个参数是定位的类型,由By提供:第二个参数是定位的具体方式。在使用By以前须要将By类导入。浏览器

from selenium.webdriver.common.by import By

经过查看WebDriver的底层实现代码发现它们实际上是一回事儿,例如,find_element_by_id()方法的实现。函数

def find_element_by_id(self, id_):
    """Finds an element by id.

    :Args:
    - id\_ - The id of the element to be found.

    :Returns:
    - WebElement - the element if it was found

    :Raises:
    - NoSuchElementException - if the element wasn't found

    :Usage:
        element = driver.find_element_by_id('foo')
    """
    return self.find_element(by=By.ID, value=id_)

但WebDriver更推荐前面介绍的写法,固然我公司底层是使用By来分装函数的。网站

2. 鼠标事件

前面不但使用过click()方法,并且还了解了下其余鼠标交互方式,例如鼠标点击、双击、悬停、甚至是鼠标拖动等功能。spa

在这一章中,我将详细说明这些功能。设计

在WebDriver中,将这些关于鼠标操做的方法封装在ActionChains类提供。code

ActionChains类提供了鼠标操做的经常使用方法:orm

perform():执行全部ActionChains中存储的行为blog

context_click():右击教程

double_click():双击

drag_and_drop():拖动

move_to_element():鼠标悬停

2.1 鼠标右击操做

对于ActionChains类所提供的鼠标方法与前面学过的click()方法的用法有所不一样。

我想了半天,愣是没想到哪一个网站能够右键,因此没办法弄出实例了。

导入提供鼠标操做的ActionChains:

from selenium.webdriver import ActionChains

调用ActionChains(driver)类,将浏览器驱动driver做为参数传入,我通常是用wd做为浏览器驱动的名称。

ActionChains(wd)

context_click(right)方法用于秒你鼠标右键操做,在调用是须要制定元素定位。

ActionChains(wd).context_click(right)

执行全部ActionChains中存储的行为,能够理解成是对整个操做的提交动做。

ActionChains(wd).context_click(right).perform()

2.2 鼠标悬停弹出下拉菜单是一个十分建立的功能设计。

move_to_element()方法能够模拟鼠标悬停的动做,其用法与context_click()相同。

from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains

wd = webdriver.Chrome()

wd.get('https://www.baidu.com/')

#定位到要鼠标悬停的元素
above = wd.find_element_by_xpath("//div[@id='u1']/a[8]")
#对定位到的元素执行鼠标悬停操做
ActionChains(wd).move_to_element(above).perform()

2.3 鼠标双击操做

double_click方法用于秒你鼠标双击操做。和前面的使用方法如出一辙,就不用代码演示了。

2.4 鼠标拖放操做

drag_and_drop(source,target)在源元素上按住鼠标左键,而后移动到目标元素上释放。

source:鼠标拖动的源元素

target:鼠标释放的目标元素

这个也没想到哪里可使用到,可能后面的滑动式验证码须要使用。

3. 键盘事件

Keys()类提供了键盘上几乎全部按键的方法。前面了解到,send_keys()方法能够用来模拟键盘输入,除此以外,咱们还能够用它来输入键盘上的按键,甚至是组合键,如Ctrl+A、Ctrl+C等。

from time import sleep
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

wd = webdriver.Chrome()

wd.get('https://www.baidu.com/')

#输入框输入内容
wd.find_element_by_id("kw").send_keys("seleniumm")

#删除多输入的一个m
wd.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)

#输入空格键+“教程”
wd.find_element_by_id("kw").send_keys(Keys.SPACE)
wd.find_element_by_id("kw").send_keys("教程")

#Ctrl+a 全选输入框内容
wd.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')

#Ctrl+x 剪切输入框内容
wd.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')

#Ctrl+v 粘贴输入框内容
wd.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')

#经过回车键来代替单击操做
wd.find_element_by_id("su").send_keys(Keys.ENTER)

须要说明的是,上面的代码没有什么实际意义,仅向咱们展现模拟键盘各类按键与组合键的使用。

在使用键盘按键方法前须要先导入keys类。

from selenium.webdriver.common.keys import Keys

如下是经常使用的键盘操做:

send_keys(Keys.BACK_SPACE)    删除键

send_keys(Keys.SPACE)    空格键

send_keys(Keys.TAB)    制表键

send_keys(Keys.ESCAPE)  回退键

send_keys(Keys.ENTER)  回车键

send_keys(Keys.CONTROL,'a')  全选

send_keys(Keys.CONTROL,'c')  复制

send_keys(Keys.CONTROL,'x')   剪切

send_keys(Keys.CONTROL,'v')   粘贴

send_keys(Keys.F1)  键盘F1

......

send_keys(Keys.F12)  键盘F12

相关文章
相关标签/搜索