python+selenium对元素常用的操作

197阅读模式

第一部分:元素常用操作api

# -- coding: utf-8 --
# @Time : 2022/7/1 9:13
# @Author : siyu.yang
# 定位到元素后,需要对元素进行曹祖,常见的有鼠标点击、键盘操作等
# 这取决于我们定位到的对象支撑那些操作。一般来说,所有与页面交互的
# 的操作都是通过WebElement接口
import os,time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver_path = os.path.join(os.path.dirname(__file__),'../driver/chromedriver.exe')
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com')
driver.set_window_size(1920,1080)
driver.implicitly_wait(30)
# webdriver 中常用的操作元素的方法有如下几个:
# clear() 清除对象的内容     send_keys()在对象上模拟按键输入
kw = driver.find_element(By.ID,'kw')
kw.send_keys('webdriver 常用api操作')
time.sleep(1)
kw.clear()
# click() 单机对象,强调对象的独立性
driver.find_element(By.LINK_TEXT,'更多').click()
# submit() : 提交表单,要求对象必须是表单
driver.find_element(By.ID,'form').submit()
kw = driver.find_element(By.CSS_SELECTOR,'input#su')
print('返回对象的尺寸:',kw.size)
print('获取对象文本:',kw.text)
print('获取对象属性值:',kw.get_attribute('class'))
print('判断对象是否可见:',kw.is_displayed())
print('判断读写是否被禁用:',kw.is_enabled())
print('判断对象是被选中:',kw.is_selected())
print('获取对象标签名:',kw.tag_name)
print('获取对象标签名称:',kw.location)
print('获取元素坐标:',kw.location)

time.sleep(10)
driver.close()
driver.quit()

第二部分:鼠标键盘操作

# -- coding: utf-8 --
# @Time : 2022/7/1 9:13
# @Author : siyu.yang
# 在实际的web产品测试中,对于鼠标的操作,不单单只有click(),有时候还要用到
# 右击、双击、拖动等操作,这些操作包含在ActionChains 类中。
# context_click() :右击
# double_click()      :双击
# drag_and_drop()      :拖动
# move_to_element()    :鼠标移动到一个元素上
# click_and_hold()     : 按下鼠标左键在一个元素上
# 鼠标右击导包
import os
import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys


driver_path = os.path.join(os.path.dirname(__file__), '../driver/chromedriver.exe')
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com')
driver.maximize_window()
driver.implicitly_wait(30)
# 鼠标操作
# setting = driver.find_element(By.CSS_SELECTOR, 'span#s-usersetting-top')
# ActionChains(driver).click(setting).release(setting).perform()
# time.sleep(3)
# 在实际的web测试中,需要配合键盘按键来操作,webdriver的keys类提供键盘上所有按键的操作,
# 还可以模拟组合键ctrl+a,ctrl+c/v等
driver.find_element(By.XPATH,'//input[@id="kw"]').send_keys(Keys.TAB)
time.sleep(1)
#利用ActionChains去进行按键操作
ActionChains(driver).send_keys(Keys.TAB).perform()
time.sleep(1)
# 组合键操作:ctrl+cctrl+v
ActionChains(driver).key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform()
time.sleep(1)
driver.find_element(By.XPATH,'//input[@id="kw"]').send_keys('selenium ui 自动化测试')
ActionChains(driver).key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform()
time.sleep(1)
ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()
time.sleep(1)
driver.find_element(By.XPATH,'//input[@id="kw"]').send_keys('444444')
time.sleep(3)
ActionChains(driver).key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()
# 备注:
# 1、在使用修饰键的时候需要key_down()和key_up()方法修饰键包含ctrl   alt   shift
# 2、类似alt+F4  ctrl+alt+delete不能使用鼠标键盘事
time.sleep(5)
driver.quit()

第三部分:等待操作

# -- coding: utf-8 --
# @Time : 2022/7/1 9:14
# @Author : siyu.yang
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
# 为了保证脚本的稳定性,有时候需要引入等待时间,等待页面加载元素后进行操作,selenium
# 提供了三种等待时候设置。
# 1.sleep():固定休眠时间设置,pyhton的time包里提供了休眠方法sleep,
# 导入包后就能使用;
# sleep()方法以秒为单位,如果超过设置小于1秒,可以使用小数
import time
time.sleep(0.5)

# 2.implicitylyWait():implicitlyWait()方法比sleep()方法智能,sleep()方法只能
# 在一个固定的时间等待,而implicitlyWait()可以在一个时间范围内等待,称为隐式等待
driver.implicityl_wait(100)
element = driver.find_element(By.CSS_SELECTOR,'div.red_box')
# 备注:设置等待100s,页面上的元素怒5s后出现,只等待5s。不会等待100秒

# 3.WebDriverWait():显示等待,语法格式如下:
# WebDriverWait(driver,timeout,poll_frequency=0.5,ignore_exceptions=None)
# driver:WebDriverWait的驱动程序(IE,火狐,谷歌或远程)
# timeout:最长等待时间,默认以秒为党委
# poll_frequency:休眠时间的间隔(步长)时间,默认为0.5秒(即每500毫秒扫描一次页面)
# ignore_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException 异常
# 举例:
from selenium.webdriver.support.ui import WebDriverWait

# 引入WebDriverWait类
element = WebDriverWait(driver,3).until(lambda x:x.find_element_by_css_selector("div.red_box"))

第四部分:处理常见的场景

# -- coding: utf-8 --
# @Time : 2022/7/1 9:14
# @Author : siyu.yang
import time,os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
# 一、定位一组对象
#    webdriver使用find_element方法定位一个特定的对象,不过我们有时需要定位一组对象,
# webdriver同样提供了定位一组元素的方法叫find_elements。定位一组对象一般用于以下场景:
# .批量操作对象,比如将页面上的checkbox都勾选上
# .先获取一组对象,再再这组对象中过滤需要具体定位的一些对象
driver_path = os.path.join(os.path.dirname(__file__),'../driver/chromedriver.exe')
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('C:\\Users\\kcadmin\\Desktop\\ui_base_projec\\element\\element_samples.html')
driver.implicitly_wait(30)
driver.maximize_window()
inputs = driver.find_elements(By.CSS_SELECTOR,'input[type="checkbox"]')
for input in inputs:
    if input.get_attribute('type') == 'checkbox':
        input.click()
time.sleep(1)
# 二、层级定位:
#    在实际的项目测试中,经常会遇到无法直接定位到需要选取的元素,但是其弗雷元素比较容易定位,
# 通过定位弗雷元素在遍历其子元素选择需要的目标元素,或者需要定位某个元素下所有的子元素。
#    层级定位的思想式先定位父类呀u盛怒,然后再从对象中精确定位出其它我们需要选取的后代元素怒
# 语法举例:
driver.find_element(By.CSS_SELECTOR,'td.widgetStyle').find_element(By.CSS_SELECTOR,'input.Baidu').click()
time.sleep(1)

# 三、frame中的对象
#    在web应用中经常会出现frame嵌套的应用,假设页面上有A,B两个frame,其中B在A内,那么定位
# B中的内容则需要先到A,再到B。
#    switch_to_frame方法把当前定位的主题切换到frame里,在frame里面实际是签到了另外一个页面
# ,而webdriver每次只能在一个页面识别,所以需要用switch_to_frame方法获取frame中嵌套的页面。
# 举例:
# driver.switch_to.frame('frame1')   #移动到id为frame_1的frame上
# print(driver.find_element(By.CSS_SELECTOR,'div1').text)
driver.switch_to.default_content()  #将是被的主题切除frame
# print(driver.find_element(By.CSS_SELECTOR('id1')).text)
# 备注:switch_to_frame 的参数必须是id或者是name,所以一个frame只要有id和name处理
# 起来是很容易,如果没有的话,两种解决思路:
# 1.让开发加上id或name
# 2.使用xpath 等方式定位然后实现跳针

# 四、浏览器出窗口处理:
#     有时候我们在测试一个web引用的时候会出现多个浏览器窗口的情况,
# webdriver提供了响应的解决方案,如下:
#     首先要获得一个窗口的唯一标识符号(句柄),通过获得的句柄来区分不通的窗口,从而对不通窗口上的元素
# 进行操作:
# 举例:
# driver.get('https://www.jd.com')
# current_handle = driver.current_window_handle
# driver.find_element(By.LINK_TEXT,'秒杀').click()
# driver.find_element(By.LINK_TEXT,'优惠券').click()
# driver.find_element(By.LINK_TEXT,'PLUS会员').click()
# driver.find_element(By.LINK_TEXT,'品牌闪购').click()
# driver.find_element(By.LINK_TEXT,'京东国际').click()
# driver.find_element(By.LINK_TEXT,'京东家电').click()
# driver.find_element(By.LINK_TEXT,'京东超市').click()
# driver.find_element(By.LINK_TEXT,'京东生鲜').click()
# handles = driver.window_handles
# driver.switch_to.window(handles[5])
# driver.find_elements(By.CSS_SELECTOR,'div.quark-5dce12a4324b479a31ebb64a__brand-tab__item-title-imactive')[2].click()
# driver.switch_to.window(current_handle)
# driver.find_element(By.LINK_TEXT,'运动鞋服').click()
# time.sleep(1)
# driver.close()
# 五、alert/confirm/prompt处理
# webdriver中处理原生JS的alert confirm 以及prompt非常方便
#     具体思路是使用switchTo.alert()方法定位到当前的alert/confirm、prompt(这里注意
# 当前页面只能同时含有一个控件,如果多了会报错的,所以这就需要一一处理了),然后再嗲用Alert方法
# 进行操作,Alert提供了以下几个方法:
# text: 返回alet/confirm/prompt中的文字内容
# accept:点击确认按钮
# dismiss:点击取消按钮,前提是有取消按钮
# sendKys:向prompt中输入文字
# 举例
#alert对话框
driver.find_element(By.NAME,'alterbutton').click()
time.sleep(1)
driver.switch_to.alert.accept()
time.sleep(1)
#prompt对话框
driver.find_element(By.NAME,'promptbutton').click()
driver.switch_to.alert.send_keys('hello promput')
driver.switch_to.alert.dismiss()
time.sleep(1)
driver.find_element(By.NAME,'promptbutton').click()
driver.switch_to.alert.send_keys('hello promput')
driver.switch_to.alert.accept()
driver.switch_to.alert.accept()
#confirm 对话框
driver.find_element(By.NAME,'confirmbutton').click()
driver.switch_to.alert.dismiss()
driver.switch_to.alert.accept()
time.sleep(1)
driver.find_element(By.NAME,'confirmbutton').click()
driver.switch_to.alert.accept()
driver.switch_to.alert.accept()

# 六、下拉框处理:
# web 页面上经常会有下拉框,对下拉框的处理笔架简单,一般分为两种情况:
# 1.下拉框通过元素识别,举例:
driver.find_element(By.XPATH,'//option[@value="mango"]').click()
# 上面的元素下拉框中的选项。

# 2.创建一个select的对象,然后通过响应方法处理,举例:
from selenium.webdriver.support.select import Select
selectElement = driver.find_element(By.XPATH,'//select[@id="Selector"]')
s = Select(selectElement)
s.select_by_index(1)
time.sleep(1)
s.select_by_value('mango')
time.sleep(1)
s.select_by_visible_text('桔子')

# 七、调用javascript:
#     当webdriver遇到无法完成的操作的时候,这个时候可以使用javascript来完成,
# webdriver提供了execute_script() 接口来调用js代码。
# 执行js有两种场景:
# 一种是在页面上直接执行js
# 另一种实在某个已经定位的元素上只想js
# 简单实例:
driver.get('C:\\Users\\kcadmin\\Desktop\\ui_base_projec\\element\\wait.html')
driver.execute_script('alert("hello!")')  #弹出窗口
driver.switch_to.alert.accept()
time.sleep(1)
driver.find_element(By.CSS_SELECTOR,'button#b').click()
time.sleep(1)
wl = driver.find_element(By.CSS_SELECTOR,'div.red_box')
driver.execute_script("arguments[0].style.border='10px solid purple'",wl)  #给元素加紫色边框
time.sleep(1)
driver.get('https://www.baidu.com')
driver.find_element(By.ID,'kw').send_keys('selenium ui 自动化测试')
js = "var user_input = document.getElementById('su').getAttribute('id');return user_input"
driver.execute_script(js)  #识别并获取对象属性
driver.find_element(By.ID,'su').click()
time.sleep(1)
driver.execute_script("var q=document.documentElement.scrollTop=10000")

# 八、cookies处理:
#    假如我们需要验证浏览器中是否存在cookie,因为基于真实的cookie是无法通过白盒和
# 集成测试完成的,webdriver可以读取、添加和删除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信息
# 举例:
#获取所有cookie并打印
driver.get("http://www.youdao.com")
for cookie in driver.get_cookies():
    print("%s -> %s" % (cookie['name'],cookie['value']))
    #添加cookie举例
    driver.add_cookie({'name':'key-aaaaa','value':'value-bbbb'})
    driver.delete_cookie("key-aaaaa")  #删除cookie处理常见自动化场景

# 九、验证码处理:
#    对于web应用,很多地方比如登录、发帖都需要输入验证码,类似
# 验证码处理一般有以下几种处理方式:
# 1.去掉验证码。
# 2.万能验证码。
# 3.通过cookie绕过登录。
# 4.图形识别技术识别验证码(存在准确度准确率的问题)

time.sleep(7)
driver.close()
driver.quit()
文章源自懂站帝-http://www.sfdkj.com/17864.html
懂站帝
  • 本文由 发表于 2022年7月5日 21:54:41
  • 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至395045033@qq.com举报,一经查实,本站将立刻删除。
评论  0  访客  0