Selenium-API基本操作

一、元素定位

1、含义:元素定位就是通过元素的信息或元素的层级结构来定位元素的

2、方式:

  • id
  • name
  • class_name
  • tag_name
  • link_text
  • partial_link_text
  • XPath
  • CSS

3、 定位方法:

#selenium 3.x 版本使用:

driver.find_element_by_xxx(xxx)    # xxx为上述8种类型


#selenium 4.x 版本使用:

from selenium.webdriver.common.by import By

driver.find_element(By.xxx, xxx)    

拓展:driver.find_elements_by_xxx()是用来定义一组元素的,返回类型为列表,访问方式与列表相同(与上述方法相比element多了个s)

2.1 id定位

(1)说明:id定位就是通过元素的id属性来定位元素的,HTML规定id属性在整个HTML文档中必须是唯一的。

(2)id定位方式:

#selenium 3.x 版本使用:

driver.find_element_by_id(id)


#selenium 4.x 版本使用:

from selenium.webdriver.common.by import By

driver.find_element(By.ID, id)

2.2 name定位

(1)说明:name定位就是根据元素name属性来定位的,HTML文档中name的属性值可以重复。

(2)name定位方式:

#selenium 3.x 版本使用:

driver.find_element_by_name(name)


#selenium 4.x 版本使用:

from selenium.webdriver.common.by import By

driver.find_element(By.NAME, name)

2.3 class_name定位

(1)说明:class_name定位就是根据元素class属性来定位元素,HTML通过使用class来定义元素的样式。

(2)class_name定位方式:

#selenium 3.x 版本使用:

driver.find_element_by_class_name(class_name)


#selenium 4.x 版本使用:

from selenium.webdriver.common.by import By

driver.find_element(By.CLASS_NAME, class_name)

2.4 tag_name定位

(1)说明:tag_name定位就是通过标签名来定位,HTML本质就是由不同的tag组成,每一种标签一般在页面中会存在多个,所以不方便进行精确定位, 一般很少使用。

(2)tag_name定位方式:

#selenium 3.x 版本使用:

driver.find_element_by_tag_name(tag_name)


#selenium 4.x 版本使用:

from selenium.webdriver.common.by import By

driver.find_element(By.TAG_NAME, tag_name)

注意:如果存在多个相同标签,则返回符合条件的第一个标签

2.5 link_text定位

(1)说明:link_text定位是专门用来定位超链接元素(<a>标签</a>),并且是通过超链接的文本内容来定位元素。

(2)link_text定位方式:

#selenium 3.x 版本使用:

driver.find_element_by_link_text(link_text)


#selenium 4.x 版本使用:

from selenium.webdriver.common.by import By

driver.find_element(By.LINK_TEXT, link_text)

link_text:为超链接的全部文本内容

2.6 partial_link_text定位

(1)说明:partial_link_text定位是对link_text定位的补充,link_text使用全部文本内容匹配元素, 而partial_link_text可以使用局部来匹配元素,也可以使用全部文本内容匹配元素。

(2)partial_link_text定位方式:

#selenium 3.x 版本使用:

driver.find_element_by_partial_link_text(partial_link_text)


#selenium 4.x 版本使用:

from selenium.webdriver.common.by import By

driver.find_element(By.PARTIAL_LINK_TEXT, partial_link_text)

partial_link_text:可以传入a标签局部文本-能表达唯一性  

2.7 XPath定位

(1)介绍:XPath即为XML Path的简称,它是一门在 XML 文档中查找元素信息的语言。HTML可以看做是XML的一种实现,所以Selenium用户可以使用这种强大的语言在Web应用中定位元素。

(2)XPath定位策略:

1、路径-定位

  • 绝对路径格式:以/html根节点开始,使用/来分隔元素层级(不建议使用)
  • 相对路径格式:以//开始,//input 或 //*

2、利用元素属性-定位

  • 格式://input[@id='属性值']   或者  //*[@id='属性值']

3、属性与逻辑结合-定位(多个属性)

  • 格式://*[@name='属性值' and @class='属性值']

4、层级与属性结合-定位(找父属性)

  • 格式://*[@id='p1']/input

(3)XPath定位方式:

#selenium 3.x 版本使用:

driver.find_element_by_xpath(xpath)


#selenium 4.x 版本使用:

from selenium.webdriver.common.by import By

driver.find_element(By.XPATH, xpath)

 (4)XPath-延伸

//*[text()="xxx"]    # 文本内容是xxx的元素 

//*[contains(@attribute,'xxx')]    # 属性中含有xxx的元素 

//*[starts-with(@attribute,'xxx')]    # 属性以xxx开头的元素

 注意:1、一般见识使用指定标签名称,不使用*代替,效率比较慢。
            2、无论是绝对路径和相对路径,/后面必须为元素的名称或者*
            3、扩展:在工作中,如果能使用相对路径绝对不使用绝对路径。

2.8 CSS定位

(1)介绍:CSS(Cascading Style Sheets)是一种语言,它用来描述HTML元素的显示样式,在CSS中,选择器是一种模式,用于选择需要添加样式的元素,在Selenium中也可以使用这种选择器来定位元素。

(2)CSS定位方式:

#selenium 3.x 版本使用:

driver.find_element_by_css_selector(css_selector)


#selenium 4.x 版本使用:

from selenium.webdriver.common.by import By

driver.find_element(By.CSS_SELECTOR, css_selector)

(3)CSS定位常用策略

1、id选择器

  • 说明:根据元素id属性来选择
  • 格式:#id

2、class选择器

  • 说明:根据元素class属性来选择
  • 格式:.class

3、元素选择器

  • 说明:根据元素的标签名选择
  • 格式:element

4、属性选择器

  • 说明:根据元素的属性名和值来选择
  • 格式:[attribute=value]  或者  element[attribute=value]

5、层级选择器

  • 说明:根据元素的父子关系来选择
  • 格式1:element1>element2       element2必须为element1的直接子元素
  • 格式2:element1 element2        element2element1的后代元素
  • 提示:>与空格的区别,大于号必须为相邻子元素,空格则不用。

(4)CSS延伸

input[type^='p']    # type属性以p字母开头的元素 

input[type$='d']    # type属性以d字母结束的元素 

input[type*='w']    # type属性包含w字母的元素

二、元素操作、浏览器操作方法

1、元素常用的操作方法

  • 使用方法: 定位元素.方法
  • 例:driver.find_element(By.ID, 'su').click()
click()    # 单击元素 

send_keys(value)    # 模拟输入 

clear()    # 清除文本

拓展:send_keys("文件路径及文件名")可以上传文件,只适用于input标签

js点击:

使用场景:当页面进行点击操作时,由于selenium运行速度过快,页面还未加载完全,导致先加载的其他元素被点击,系统报错

使用方法:

element = self.base_find_element(By.Xpath,"//*[text()='点击登录']")  # 括号里为定位信息
driver.execute_script("arguments[0].click();", element)

2、操作浏览器的常用方法

  • 使用方法:driver.方法(前提:driver = webdriver.Chrome())
  • 例:driver.maximize_window()    # 窗口最大化
maximize_window()                 # 最大化浏览器窗口 --> 模拟浏览器最大化按钮 
set_window_size(width, height)    # 设置浏览器窗口大小 --> 设置浏览器宽、高(像素点) 
set_window_position(x, y)         # 设置浏览器窗口位置 --> 设置浏览器位置 
back()                            # 后退 --> 模拟浏览器后退按钮 
forward()                         # 前进 --> 模拟浏览器前进按钮 
refresh()                         # 刷新 --> 模拟浏览器F5刷新 
close()                           # 关闭当前窗口 --> 模拟点击浏览器关闭按钮 
quit()                            # 关闭浏览器驱动对象 --> 关闭所有程序启动的窗口 
title                             # 获取页面title 
current_url                       # 获取当前页面URL

提示:

1. driver.title 和 driver.current_url 没有括号,应用场景:一般为判断上步操作是否执行成功
2. driver.maximize_window() 一般为前置代码,在获取driver后,直接编写最大化浏览器
3. driver.close()与driver.quit()区别:
        close():关闭当前主窗口
        quit():关闭由driver对象启动的所有窗口
        提示:如果当前只有1个窗口,close与quit没有任何区别。

3、获取元素信息的常用方法

  • 使用方法: 定位元素.方法
  • 例:driver.find_element(By.ID, 'su').get_attribute("id")
size                  # 返回元素大小 
text                  # 获取元素的文本 
get_attribute("xxx")  # 获取属性值,传递的参数为元素的属性名 
is_displayed()        # 判断元素是否可见 
is_enabled()          # 判断元素是否可用 
is_selected()         # 判断元素是否选中,用来检查复选框或单选按钮是否被选中 

提示:

1. text和size调用时无括号
2. get_attribute应用场景:判断一组元素是否为想要的元素或者判断元素属性值是否正确
3. is_displayed、is_enabled、is_selected,在特殊应用场景中使用。


三、鼠标和键盘操作

1、鼠标操作的方法

说明:在Selenium中将操作鼠标的方法封装在ActionChains类中 

导包:from selenium.webdriver import ActionChains

实例化对象: action = ActionChains(driver) 

方法:
    1. context_click(element).perform()         # 右击 --> 模拟鼠标右键点击效果 
    2. double_click(element).perform()          # 双击 --> 模拟鼠标双击效果 
    3. drag_and_drop(source, target).perform()  # 拖动 --> 模拟鼠标拖动效果 
    4. move_to_element(element).perform()       # 悬停 --> 模拟鼠标悬停效果 
    5. perform()                                # 执行 --> 此方法用来执行以上所有鼠标操作

2、常用的键盘操作方法

  • 使用方法:定位元素.send_keys(方法)
  • 例:driver.find_element(By.ID, 'su').send_keys(Keys.BACKSPACE)
导包:from selenium.webdriver import Keys

send_keys(Keys.BACK_SPACE)      # 删除键(BackSpace) 
send_keys(Keys.SPACE)           # 空格键(Space) 
send_keys(Keys.TAB)             # 制表键(Tab) 
send_keys(Keys.ESCAPE)          # 回退键(Esc) 
send_keys(Keys.ENTER)           # 回车键(Enter) 
send_keys(Keys.CONTROL,'a')     # 全选(Ctrl+A) 
send_keys(Keys.CONTROL,'c')     # 复制(Ctrl+C)

四、元素等待

1、概念:在定位页面元素时如果未找到,会在指定时间内一直等待的过程

2、元素等待类型:

(1)隐式等待:定位元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常 NoSuchElementException。

方法:driver.implicitly_wait(timeout)     # 一般设置30秒
        (timeout:为等待最大时长,单位:秒) 

说明:隐式等待为全局设置(只需要设置一次,就会作用于所有元素)

(2)显式等待:定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长时还没有找到指定元素,则抛出超时异常 TimeoutException。

1. 导包 等待类 --> from selenium.webdriver.support.wait import WebDriverWait

2. WebDriverWait(driver, timeout, poll_frequency=0.5) 
    1). driver:浏览器驱动对象 
    2). timeout:超时的时长,单位:秒 
    3). poll_frequency:检测间隔时间,默认为0.5秒 

3. 调用方法 until(method):直到...时 
    1). method:函数名称,该函数用来实现对元素的定位 
    2). 一般使用匿名函数来实现:lambda x: x.find_element_by_id("userA") 

4. element=WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_id("userA"))

3、两种元素等待的区别

  • 显示等待:针对单个元素生效
  • 隐式等待:针对全局元素生效

五、下拉选择框、弹出框、滚动条操作

1、下拉选择框

(1)说明:下拉选择框就是HTML中<select>元素

(2)操作方法

  • 使用方法:Select(driver.find_element(By.NAME,'name')).select_by_index(1)
说明:Select类是Selenium为操作select标签特殊封装的 

实例化对象: 
    select = Select(element) 
        element: <select>标签对应的元素,通过元素定位方式获取

操作方法: 
    1. select_by_index(index)         # 根据option索引来定位,从0开始     
    2. select_by_value(value)         # 根据option属性 value值来定位 
    3. select_by_visible_text(text)   # 根据option显示文本来定位

2、弹出框操作

(1)弹出框类型:

  • alert           警告框
  • confirm      确认框
  • prompt       提示框

(2)处理方法:

1. 获取弹出框对象 
    alert = driver.switch_to.alert 

2. 调用:
    alert.text          # 返回alert/confirm/prompt中的文字信息 
    alert.accept()      # 接受对话框选项 
    alert.dismiss()     # 取消对话框选项

3、滚动条

(1)说明:一种可控制页面显示范围的组件

(2)操作方法:

1. 设置JavaScript脚本控制滚动条 
    js = "window.scrollTo(0,1000)" 
        (0:左边距;1000:上边距;单位像素) 

2. selenium调用执行JavaScript脚本的方法 
    driver.execute_script(js)

六、frame切换、多窗口切换

1、frame切换

(1)介绍:HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素

(2)操作方法:

方法:
    1.driver.switch_to.frame(frame_reference)    # 切换到指定frame的方法 
        frame_reference:可以为frame框架的name、id或者定位到的frame元素 

    2.driver.switch_to.default_content()    # 恢复默认页面方法

注意:在frame中操作其他页面,必须先回到默认页面,才能进一步操作

2、多窗口切换

(1)说明

(2)操作方法:

  • 句柄:英文handle,窗口的唯一识别码
driver.current_window_handle        # 获取当前窗口句柄

driver.window_handles               # 获取所有窗口句柄 

driver.switch_to.window(handle)     # 切换指定句柄窗口

七、窗口截图、验证码处理

1、窗口截图

方法: driver.get_screenshot_as_file(imgpath)
            imgpath:图片保存路径

2、验证码

(1)说明:一种随机生成的信息(数字、字母、汉字、图片、算术题)等为了防止恶意的请求行为,增加应用的安全性。

(2)处理方式:

  • 去掉验证码(测试环境)
  • 设置万能验证码(测试、线上环境)
  • 验证码识别技术(不推荐使用,准确率低)
  • 记录cookie(推荐使用)

(3)cookie跳过登录方法

  • 使用方法:driver.方法
方法:
    1. get_cookie(name)           # 获取指定cookie 
            name:为cookie的名称 
    2. get_cookies()              # 获取本网站所有本地cookies 
    3. add_cookie(cookie_dict)    # 添加cookie 
            cookie_dict:一个字典对象,必选的键包括:"name" and "value"

 提示:添加cookie后必须使用driver.refresh()刷新方法,否则看不到登录效果


八、文件上传

1、input标签文件上传

使用场景:如果页面需要上传文件,通常在页面源代码中都能找到input标签元素

el = driver.find_element(By.Xpath, "//*[@name='file']")
el.send_keys(r'E:\data\test.png')
注意:上传的文件需要使用绝对路径表示文件位置及文件名

2、打开window系统弹窗上传文件

使用场景:当页面上传文件需要打开window系统弹窗上传文件,这时候selenium就起不到控制系统的作用,这时候就需要其他工具辅助

使用工具

  • pywinauto:根据GUI元素/控件实现文件上传
  • pyautogui:使用坐标系统定位元素,可以跨平台使用,不支持中文输入(可以使用剪切板)

3、文件上传并发问题

        通过系统弹窗上传文件简单直接,但是当程序需要并发操作时,这种方法实现文件上传就会变的很麻烦。如果程序需要并发执行上传文件,最好还是通过input标签,使用send_keys()方法实现上传文件

猜你喜欢

转载自blog.csdn.net/ouihsiad/article/details/126826232
今日推荐