zoukankan      html  css  js  c++  java
  • Python+selenium自动化测试元素操作

    #########################

    需要掌握两类
    1,元素的操作
    2,浏览器的操作

    ###############################

    元素的常用操作方法
    1,clear() 清空
    2,sendkeys() 输入值,需要有参数,
    3,click() 点击

    #############################

    浏览器的常用操作
    1,driver.maximize_window() 最大化窗口,一定要记住,
    2,driver.set_window_size(100,100) 设置窗口大小
    3,driver.set_window_position(100,200) 设置窗口位置,
    4,back()
    5,forward()
    6,refresh()
    7,close() 关闭单个窗口,
    8,quit() 关闭所有的窗口,

    #################################

    学习webdriver的其他方法
    1,获取元素的大小
    2,获取元素的文本,这是非常重要的,往往是一个是否登陆成功的验证条件,
    3,获取元素的属性值
    4,判断元素是否为可见状态,

    1,size 获取元素的大小,这是后面没有括号的,需要定位元素
    2,text, 获取元素的文本,需要定位元素, 这是后面没有括号的,
    3,title 获取页面的title 这就是预期的你进入页面的结果,不需要定位元素,没有括号,
    4,current_url 获取当前的url,没有括号,
    5,get_attribute('XXX') 获取属性的值,XXX要获取的属性, 比如获取一个超链接的url地址,href,
    6,is_display() 判断元素是否可见,
    7,is_enabled() 判断元素是否可用,比如一个按钮是否可以点击,或者你要点击同意之后才可用, 都是常用的场景,

    ##################################

    webdriver的鼠标和键盘操作,这个了解,不常用,鼠标有一个常用的就是悬停,
    1,context_click() 右击,但是你是不能选择弹出的菜单的,
    2,double_click() 双击
    3,drag_and_drop() 拖拽
    4,move_to_element() 悬停
    5,perform() 此方法用来执行上面的所有的方法

    这是导入包,from selenium.webdriver.common.action_chains import ActionChains
    实例化actionchains对象,action = ActionChains(driver)
    调用右击方法,ac = action.context_click(element) 这个username是说在哪里进行右击,传递的是已经定位好的元素,element
    执行 ac.perform()

    可以写成一句:ActionChains(driver).context_click(element).perform()

    悬停也是一样的,悬停之后会有效果,

    ######################################

    鼠标拖拽需要单独说一下
    1,首先要定义两个元素,source target
    2,drag_and_drop(source,target) 这是传递两个地址,
    3,drag_and_drop(source,500,0 )   这是拖拽500个像素,

    ####################################

    键盘操作,模拟键盘上面的组合操作,比如ctrl+c  ctrl+v
    导入包,from selenium.webdriver.common.keys import Keys
    1,sendkeys(keys.BACK_SPACE)   删除键
    2,sendkeys(keys.SPACE) 空格
    3,sendkeys(keys.TAB) 
    4,sendkeys(keys.ESCAPE)
    5,sendkeys(keys.ENTER) 
    6,sendkeys(keys.CONTROL,'a') 
    7,sendkeys(keys.CONTROL,'c') 

    #######################################

    元素等待:
    1,元素等待,这是非常重要的, 如果在加载是操作不到的,所以要等待加载完,然后才做, 这种有显示等待,隐式等待
    2,不设置等待会报出异常,因为找不到元素, 和网速有关系,

    显式等待, 这种方法比较复杂,不常用,我们常用的是隐式等待,我们工作中也是使用隐式等待,
    1,导包
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import  expected_conditions as EC

    2,ctrl+alt+空格,导入包
    ctrl+p 提示参数

    #######################################

    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.wait import WebDriverWait
    from selenium.webdriver.support import  expected_conditions as EC
    from time import sleep
    
    
    # 实例化浏览器
    driver = webdriver.Firefox()
    driver.get("https://www.baidu.com")
    element = (By.CSS_SELECTOR,'#kw')
    WebDriverWait(driver,10).until(EC.presence_of_element_located(element)).send_keys('admin')
    sleep(2)
    driver.quit()
    
    可以分开写:
    driver = webdriver.Firefox()
    driver.get("https://www.baidu.com")
    element = (By.CSS_SELECTOR,'#kw')
    wait = WebDriverWait(driver,10)
    element = wait.until(EC.presence_of_element_located(element))
    element.send_keys('admin')
    sleep(2)
    driver.quit()

    如果找不到元素,会报出一个异常,

    ######################################

    隐式等待
    1,作用于全部的元素,显示等待是作用于一个元素的,
    # 实例化浏览器
    driver = webdriver.Firefox()
    driver.get("https://www.baidu.com")
    driver.implicitly_wait(10) # 这里设置10秒,工作中一般设置30秒,
    element = driver.find_elements_by_css_selector('#kw').send_keys('123')
    sleep(2)
    driver.quit()
    
    所以我们在写的时候,打开页面,
    先写最大化窗口
    之后就是写隐式等待,

    #################################

    下拉框,警告框,滚动条的操作
    掌握调用js的方法

    ###############################

    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.wait import WebDriverWait
    from selenium.webdriver.support import  expected_conditions as EC
    from time import sleep
    
    
    # 实例化浏览器
    driver = webdriver.Firefox()
    driver.get("https://www.baidu.com")
    
    # select的操作
    # 第一种方式 tag_name 定位
    tags = driver.find_elements_by_tag_name('option')
    for tag in tags:
        if tag.get_attribute('value') == 'sh':
            tag.click()
    
        if tag.text =='重庆':
            tag.click()
    # 这种方式,不能切换,因为for循环是从上往下的,
    
    # 第二种方式 css 定位
    driver.find_elements_by_css_selector('[value = "sh"]').click()
    driver.find_elements_by_css_selector('[value = "cq"]').click()
    driver.find_elements_by_css_selector('[value = "bj"]').click()
    
    # 这种方式如果有300个城市怎么办?
    
    # 第三种方法 select  这是专门用来select标签诞生的,
    # 有三种方法:
    # select_by_index()
    # select_by_value()
    # select_by_visible_value()
    # 记住这三种方法是直接就选中了,不需要再去点击了,
    from selenium.webdriver.support.select import Select
    selectEle = driver.find_elements_by_css_selector('select')
    select = Select(selectEle)
    select.select_by_index(1)
    select.select_by_index(2)
    select.select_by_index(3)
    select.select_by_value('sh')
    select.select_by_value('bj')
    select.select_by_visible_text('上海')
    
    sleep(2)
    driver.quit()

    ########################################

    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.wait import WebDriverWait
    from selenium.webdriver.support import  expected_conditions as EC
    from time import sleep
    
    
    # 实例化浏览器
    driver = webdriver.Firefox()
    driver.get("https://www.baidu.com")
    
    # 警告框
    # text  获取文本,  这是没有括号的,
    # accept()   确定
    # dismiss()  取消
    
    # 想要使用这三种方法,要先获取这个警告框,
    #
    alertEle = driver.find_elements_by_css_selector('#alert')  # 定位警告框
    alertEle.click()  # 点击
    alert = driver.switch_to.alert  #切换到警告框上,
    # 然后就可以使用这三个方法了,
    text = alert.text  # 需要一个变量接收
    print(text)
    alert.accept()
    alert.dismiss()  # 取消和确定,不能同时使用的,
    sleep(2)
    driver.quit()

    #######################################

    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.wait import WebDriverWait
    from selenium.webdriver.support import  expected_conditions as EC
    from time import sleep
    
    
    # 实例化浏览器
    driver = webdriver.Firefox()
    driver.get("https://www.baidu.com")
    
    # 滚动条的操作
    # 提供了js脚本调用方法,所以可以js控制滚动条
    
    # 最底层
    # js1 = "window.scrollTo(0,1000)"  # window是窗口句柄,scroll这是滚动条的意思,第一个0是距离最左侧0, 第二个是距离最顶部1000
    # 最顶层
    # js1 = "window.scrollTo(0,0)"
    # 执行
    # driver.execute_script(js1)
    
    
    js1 = "window.scrollTo(0,1000)"
    driver.execute_script(js1)
    
    sleep(2)
    driver.quit()

    ########################################

    frame表单的切换:
    #
    实例化浏览器 driver = webdriver.Firefox() driver.get("https://www.baidu.com") # frame表单的切换: # 1,页面里面有套了页面,你需要切换进入frame才可以操作里面的元素, # 2,frame是引用了另一个页面, # 方法: # driver.switch_to.frame('frame_name') # 里面是frame的name # driver.switch_to.default_content() # 恢复到默认页面, driver.switch_to.frame('name') driver.switch_to.default_content() sleep(2) driver.quit()

    ###################################

    窗口的切换和截图

    #
    实例化浏览器 driver = webdriver.Firefox() driver.get("https://www.baidu.com") # 截图保存,一般配合断言的使用 # 多窗口切换 # 提供了三种方法 # current = driver.current_window_handle # 获取当前窗口的句柄 # handle = driver.window_handles # 获取所有的窗口的句柄 # driver.switch_to.window(handle) # 切换到指定句柄 current = driver.current_window_handle driver.find_element_by_link_text('百度').click() for hanle in driver.window_handles: if hanle != current: driver.switch_to.window(hanle) # 下面就是操作 driver.find_elements_by_css_selector('#id').send_keys('123') # 截图 driver.get_screenshot_as_file('../img/123.png') # 括号里面是保存路径 sleep(2) driver.quit()

    ##################################

    # 验证码
    # 处理方法
    # 测试环境,去掉验证码
    # 生产环境,设置万能验证码,
    # 验证码识别技术,很难达到100%,验证码种类繁多啊,
    # 记录cookie,记录cookie进行登陆,推荐,这个方法主要进行讲解,

    ##################################

    cookie
    用户登陆之后,服务器一般都会设置cookie,保存在浏览器,
    你再去请求的时候,服务器校验cookie,有的话就不需要在去登陆了,实现了长连接,否则每次都要登陆
    
    所以你可以先登陆,然后使用自动化脚本的时候,把cookie带上, 然后服务器就不要让你再登陆了,所以你都成功登陆了,你就不需要考虑验证码了
    
    这就是绕过了验证码

    方法:
    get_cookie(name) name是键名,获取指定的cookie
    get_cookie() 获取本网站本地所有cookie
    add_cookie(str) 添加cookie, str要是字典格式的, str = {"id":"userid","name":"usename"}

    ########################################

    获取百度的所有的cookie


    from
    selenium import webdriver from time import sleep import json # 实例化浏览器 driver = webdriver.Firefox() driver.get("https://www.baidu.com") #程序打开网页后20秒内手动登陆账户 sleep(20) with open('cookies.txt','w') as cookief: #将cookies保存为json格式 cookief.write(json.dumps(driver.get_cookies())) sleep(2) driver.quit()

    ##########################################

    把所有的cookie都设置到浏览器中,然后刷新页面就发现百度登陆了,

    from
    selenium import webdriver from time import sleep import json # 实例化浏览器 driver = webdriver.Firefox() driver.get("https://www.baidu.com") #首先清除由于浏览器打开已有的cookies driver.delete_all_cookies() def getPureDomainCookies(cookies): domain2cookie={} #做一个域到cookie的映射 for cookie in cookies: domain=cookie['domain'] if domain in domain2cookie: domain2cookie[domain].append(cookie) else: domain2cookie[domain]=[] maxCnt=0 ansDomain='' for domain in domain2cookie.keys(): cnt=len(domain2cookie[domain]) if cnt > maxCnt: maxCnt=cnt ansDomain=domain ansCookies=domain2cookie[ansDomain] return ansCookies with open('cookies.txt','r') as cookief: #使用json读取cookies 注意读取的是文件 所以用load而不是loads cookieslist = json.load(cookief) cookieslist = getPureDomainCookies(cookieslist) # 方法1 将expiry类型变为int for cookie in cookieslist: #并不是所有cookie都含有expiry 所以要用dict的get方法来获取 if isinstance(cookie.get('expiry'), float): cookie['expiry'] = int(cookie['expiry']) driver.add_cookie(cookie) #方法2删除该字段 # for cookie in cookieslist: # #该字段有问题所以删除就可以 浏览器打开后记得刷新页面 有的网页注入cookie后仍需要刷新一下 # if 'expiry' in cookie: # del cookie['expiry'] # driver.add_cookie(cookie) driver.refresh() sleep(10) driver.quit()

    ##############################################

    ###################################

  • 相关阅读:
    Qt 6 正式发布
    GTK 4.0 正式发布
    编译 flink 1.12.0
    Flink 1.12.0 sql 任务指定 job name
    【翻译】Apache Flink 1.12.0 Release Announcement
    【源码】Flink 三层图结构 —— JobGraph 生成过程
    【源码】Flink 算子 chain 在一起的条件
    Web开发基础之CMDB系统开发之三
    Web开发基础之CMDB系统开发之二
    Ubuntu18.04升级至20.04
  • 原文地址:https://www.cnblogs.com/andy0816/p/12527883.html
Copyright © 2011-2022 走看看