Selenium基础知识点总结

一、自动化测试是什么?
自动化测试是指通过自动化测试工具或其他手段,按照测试人员的测试计划进行自动测试,目的是减轻手工测试的工作量。

二、操作
1.环境搭建
1.为python安装selenium模块:pip install selenium
2.下载相应浏览器驱动:Chromedriver;Firefoxdriver

2.selenium知识点汇总
一、selenium之元素定位
正常情况下优先级:id>name>CSS selector>xpath
优先选择CSS selector的原因
1.css配合html工作,xpath配合xml工作
2.相对xpath,更简洁
3.前端开发主要使用css
除了find_element_by_xxx(),find_element()函数也可以定位
需要导入By即from selenium.webdrive.common.by import By.
from selenium import webdriver
from time import sleep
"""
测试demon是http://sahitest.com/demo/
"""

class Dwelement(object):

#初始化
def __init__(self):
    #实例化浏览器
    self.drive=webdriver.Chrome()
    #URl
    self.drive.get('http://sahitest.com/demo/')
    #全屏
    self.drive.maximize_window()
#find_element_by_id
def Dw_by_id(self):
    self.drive.find_element_by_link_text('Link Test').click()
    sleep(1)
    self.drive.find_element_by_id('linkById').click()
    #返回
    self.drive.back()
    #返回主界面
    self.drive.back()


#find_element_by_name
def Dw_by_name(self):
    self.drive.find_element_by_link_text('Form Test').click()
    #弹框
    al=self.drive.switch_to.alert
    sleep(1)
    al.accept()
    self.drive.find_element_by_name('t1').send_keys('hello selenium')
    sleep(1)
    self.drive.back()

#find_element_by_css
def Dw_by_css(self):
    self.drive.find_element_by_link_text('Form Test').click()
    #处理弹框
    al=self.drive.switch_to.alert
    al.accept()
    self.drive.find_element_by_css_selector('body > form > table > tbody > tr:nth-child(3)\
    > td:nth-child(2) > input[type=text]').send_keys('hello')



#find_element_by_xpth
def Dw_by_xpth(self):
    self.drive.find_element_by_link_text('Form Test').click()
    #处理弹框
    al=self.drive.switch_to.alert
    sleep(1)
    al.accept()#/html/body/form/table/tbody/tr[3]/td[2]/input
    # self.drive.find_element_by_xpath('/html/body/form/table/tbody/tr[3]/td[2]/input').send_keys('hello')
    self.drive.find_element_by_xpath('.//tr[3]/td[2]/input').send_keys('hello')


#find_element_by_clssname
def Dw_by_class(self):
    self.drive.find_element_by_link_text('Element On Top Test').click()
    sleep(1)
    element=self.drive.find_elements_by_class_name('parent')
    print(element)

if name=="main":
e=Dwelement()
e.Dw_by_id()
sleep(1)
e.Dw_by_name()
sleep(1)
e.Dw_by_xpth()
e.Dw_by_css()
e.Dw_by_class()
二、selenium之浏览器控制
1.控制浏览器大小
2.浏览器前进、后退、刷新
3.webdriver常用方法和其它方法
from selenium import webdriver
from time import sleep

class Browser(object):

#初始化
def __init__(self):
    #实例化浏览器
    self.driver=webdriver.Chrome()
    #以必应为demo
    self.driver.get('https://cn.bing.com/')

def Set_window(self):
    #控制浏览器大小 设置宽800像素 高600像素
    self.driver.set_window_size(800,600)
    #全屏显示
    self.driver.maximize_window()
    #最小浏览器
    self.driver.minimize_window()

def Control(self):
    #定位搜索框
    s=self.driver.find_element_by_id('sb_form_q')
    s.send_keys('自动化测试')
    s.submit()#submit()方法用于提交表单。 在搜索框输入关键字之后的“回车” 操作,
    # self.driver.find_element_by_id('sb_form_go').click()
    #后退
    self.driver.back()
    #前进
    self.driver.forward()
    #刷新
    self.driver.refresh()


def Other(self):
    """
    size;返回元素大小
    text:返回元素文本
    get_attribute:获得属性值
    is_displayed():检测元素是否用户可见
    :return:
    """
    get_att=self.driver.find_element_by_id('id_a').get_attribute(name='aria-label')
    print(get_att)
    txt=self.driver.find_element_by_id('id_s').text
    print(txt)

if name == 'main':
e=Browser()
# e.Set_window()
# e.Control()
e.Other()
三、selenium之iframe切换
iframe,称为浮动帧标记,可以将一个html文件嵌入到另一个html文件中
常用的方法:
switch_to.frame() 切换到iframe上
switch_to.default_content() 切回到原主页面上
通过定位或者索引进行切换
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
class Iframes(object):
#初始化
def init(self):
self.drive=webdriver.Chrome()
self.drive.get('http://sahitest.com/demo/')
self.drive.maximize_window()

def Frames(self):
    #切入第一个frame
    self.drive.find_element_by_link_text('Frames Test').click()
    sleep(1)
    self.drive.switch_to.frame(0)
    self.drive.find_element(By.LINK_TEXT,'Link Test').click()
    self.drive.switch_to.default_content()
    self.drive.switch_to.frame(1)
    self.drive.find_element(By.LINK_TEXT,'Link Test').click()
    self.drive.quit()



def IFrame(self):
    self.drive.find_element(By.LINK_TEXT, "IFrames Test").click()
    sleep(1)
    self.drive.switch_to.frame(0)
    self.drive.find_element(By.LINK_TEXT, "Link Test").click()
    self.drive.switch_to.default_content()
    self.drive.switch_to.frame(1)
    self.drive.find_element(By.LINK_TEXT, "Link Test").click()

if name == 'main':
e=Iframes()
# e.Frames()
e.IFrame()
四、selenium之多标签页切换
current_window_handle:获取当前标签页句柄
window_handles:返回所有标签页句柄
switch_to.window(标签页句柄):切换到对应的标签页
from selenium import webdriver
from time import sleep

class BQ(object):

#初始化 以百度e为demo
def __init__(self):
    self.driver=webdriver.Chrome()
    self.driver.get('http://www.baidu.com')
    self.driver.maximize_window()

def bq(self):
    #点击更多
    self.driver.find_element_by_link_text('更多').click()
    #当前页面句柄
    current_handle=self.driver.current_window_handle
    #所有页面句柄
    handles=self.driver.window_handles
    for handle in handles:
        if handle!=current_handle:
            #切换句柄
            self.driver.switch_to.window(handle)
    #搜索框定位
    s=self.driver.find_element_by_id('kw')
    s.send_keys('python')
    s.submit()

if name == 'main':
e=BQ()
e.bq()
五、selenium之鼠标和键盘事件
——————————————————————————
鼠标事件:提供了ActionChains
常用方法:
perform()执行操作;context_click():右击;
double_click():双击;drag_and_drop():拖动;
move to element():鼠标悬停
——————————————————————————
键盘事件: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)
......
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains

class Ac(object):
#以http://sahitest.com/demo/为demo
def init(self):
#实例化
self.driver=webdriver.Chrome()
self.driver.get('http://sahitest.com/demo/')
self.driver.maximize_window()

#鼠标拖动
def ac_td(self):
    #进入该页面
    self.driver.find_element_by_link_text('Drag Drop Test').click()
    #定位原位置
    source=self.driver.find_element_by_id('dragger')
    #目标位置
    target=self.driver.find_element_by_css_selector('body > div:nth-child(4)')
    ActionChains(self.driver).drag_and_drop(source,target).perform()#perform不要忘记


#鼠标悬停
def ac_xt(self):
    #进入该页面
    self.driver.find_element_by_link_text('Mouse over').click()
    #元素定位
    lo=self.driver.find_element_by_css_selector('body > a:nth-child(2) > span')
    ActionChains(self.driver).move_to_element(lo).perform()

if name == 'main':
e=Ac()
# e.ac_td()
e.ac_xt()
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys

class Kb(object):
#以百度demo为例
def init(self):
self.driver=webdriver.Chrome()
self.driver.get('https://www.baidu.com/')
self.driver.maximize_window()

def demo(self):
    s=self.driver.find_element_by_id('kw')
    s.send_keys('在吗')
    #输入一个空格
    s.send_keys(Keys.SPACE)
    #再次输入
    s.send_keys('我在')

    #键盘输入回车
    s.send_keys(Keys.ENTER)

if name == 'main':
Kb().demo()

六、selenium之其它操作
·下拉框
·警告框处理
·断言
·设置元素等待
·窗口截图
·文件上传
from selenium import webdriver
from time import sleep
import time,os
from selenium.webdriver.support.select import Select

class Othermethed(object):

#http://sahitest.com/demo/为demo
def __init__(self):
    self.driver=webdriver.Chrome()
    self.driver.get('http://sahitest.com/demo/')
    self.driver.maximize_window()
    """
    两种类型:显式等待和隐式等待
    from selenium.webdriver.support.ui import WebdriverWait
    from selemium.webdriver.support import expected_contions as Ec
    #默认0.5s 最多等5s
    WebDriverWait(driver,5,0.5).util()
    """
    #设置元素隐式等待
    self.driver.implicitly_wait(10)

def sl(self):
    #进入slect页面
    self.driver.find_element_by_link_text('Select Test').click()
    #下拉框定位
    lo=self.driver.find_element_by_id('s1Id')
    #选择的方法有多种 value index text
    Select(lo).select_by_value('o1')

def al(self):
    """
    text:返回信息
    accept()接受
    dismiss()取消
    send_keys()发送文本
    :return:
    """
    #进入alert页面
    self.driver.find_element_by_link_text('Alert Test').click()
    #触发alert
    self.driver.find_element_by_name('b1').click()
    self.driver.switch_to.alert.accept()

def upload(self):
    #进入文件上传页面
    self.driver.find_element_by_link_text('File Upload Test').click()
    #input标签直接send_keys()
    self.driver.find_element_by_id('file').send_keys(r'F:\Desktop\hamlet.txt')
    self.driver.find_element_by_name('submit').click()
    #截图
    t=time.time()
    path=os.path.dirname(os.path.dirname(__file__))+'\\screenshot'
    picture_name=path+"\\"+str(t)+'.png'
    self.driver.save_screenshot(picture_name)

if name == 'main':
e=Othermethed()
# e.sl()
# e.al()
e.upload()

总结
以上内容都是基础,在真实的项目上会遇到很多问题,我们可以通过脚本录制等多种方法再次进行元素定位从而解决。

上一篇:Cobalt Strike从入门到精通之Web Drive-By web钓鱼攻击


下一篇:ORB-SLAM2地图保存新拓展