• seleniumselenium各种技巧,滑动,提示框,窗口大小,iframe切换等等


    1 、打开浏览器

    方法一:默认安装到C盘,Chrome

    from selenium import webdriver
    # 打开浏览器
    driver = webdriver.Chrome()
    #放大浏览器
    driver.maximize_window()
    # 打开百度浏览器
    driver.get("http://www.jianshu.com")
    driver.implicitly_wait(10)

    方法二:Chrome浏览器没有安装到C盘

    from selenium import webdriver
    options = webdriver.ChromeOptions()
    options.binary_location = r"E:softGoogleChrome_72ChromePortableAppGoogle Chromechrome.exe"
    driver = webdriver.Chrome(executable_path=r"E:softpython3.6chromedriver.exe",chrome_options=options)
    driver.get("https://www.baidu.com")
    #浏览器窗口最大化
    driver.maximize_window()
    #隐式等待10s
    driver.implicitly_wait(10)

    2、获取元素信息

        1. text 属性,显示该元素在web页面显示出来的文本内容

        2. get_attribute方法

          获取某个属性的值:

            element.get_attribute(元素属性)

            element.get_attribute('href')

            element.get_attribute('style')

          获取该元素对应HTML源代码:

            element.get_attribute('outerHTML')

          获取该元素的内部部分的HTML源代码:

            element.get_attribute('innerHTML')

    3、BeautifulSoup4库  

        这种方式使用的频率很少,大家可以百度查找详细的介绍信息

    4、隐士等待时间

        driver.implicitly_wait(10)

    5、显示等待

        from selenium.webdriver.support.ui import WebDriver

        from selenium.webdriver.support import expected_conditions as EC

        from selenium.webdriver.common.by import By    

        ele = WebDriverWait(driver,60)

        until(EC.presence_of_element_located((By.ID,'username')))

        #等待60s,知道一个元素出现,id为username的元素

          举个实例:  

    #为id为1的元素先设置隐士等待=60秒,无论找到未找到,隐士等待时间都会重置为10秒
    driver.implicitly_wait(60)
    try:
        ele = driver.find_element_by_id('1')
        print (ele.text)
    
        if ele.text.startswith('松勤网 - 松勤软件测试')
            print('pass')
        else:
            print('fail')
    except:
        print('exception happend')
    finally:
        driver.implicitly_wait(10)

    6、frame处理 : 网页中内嵌的网页,frame/iframe

          切换frame

            driver.switch_to.frame(frame_reference)

              1. frame元素的name属性或者ID属性

              2. 索引值(从0开始)

              3. frame所对应的WebElement :   driver.find_element_by_tag_name("iframe")

          切换回主html里面:  driver.switch_to.default_content() 

                       切换到上一层frame框:driver.switch_to.parent_frame()

    from selenium import webdriver
    from test import mysql_test as myS
    import time
    driver = webdriver.Chrome(executable_path=r"E:softpython3.6chromedriver.exe")
    driver.get("https://mail.qq.com/cgi-bin/loginpage")
    #浏览器窗口最大化
    driver.maximize_window()
    #隐式等待10s
    driver.implicitly_wait(10)
    
    #切换iframe,切换后点击切换后的iframe对应的元素
    driver.switch_to.frame(driver.find_element_by_id("login_frame"))
    driver.find_element_by_id("u").send_keys("123456")
    #切换原html
    driver.switch_to.default_content()
    #点击微信登录
    driver.find_element_by_id("wxLoginTab").click()
    #切换到iframe框架
    wei = driver.find_element_by_id("login_wx_iframe")
    driver.switch_to.frame(wei)
    #获取标题
    print (driver.title)
    #获取当前的URL
    print(driver.current_url)
    #截图
    driver.get_screenshot_as_file('d://ssl.png')
    #获取窗口的大小,返回字典{'width': 1936, 'height': 1056}
    size = driver.get_window_size()
    print (size)
    driver.set_window_size(size['width'],400)

    7、切换窗口,句柄handle

      切换到新的窗口里面操作

        1.循环遍历  driver.window_handles

        2.driver.switch_to.window(handle)方法切入新窗口

        3.检查该窗口特点,是否为要切入的那个

      切换最初的窗口

        保存主窗口的handle

      关闭窗口

        close方法 

    #获取浏览器所有的handle
    driver.get("http://www.baidu.com")
    driver.implicitly_wait(10)
    driver.find_element_by_id("kw").send_keys("松勤自动化 ")
    driver.find_element_by_css_selector("[id='1']>h3>a").click()
    print(driver.window_handles)

    #循环遍历所有的handle,如果浏览器的title等于某一个title,或者某一个title里面存在某一个元素
    for handle in driver.window_handles:
    #切换新窗口
    driver.switch_to.window(handle)
    if driver.title == '预期窗口':
    break

    #循环遍历所有的handle,跳转到窗口,如果元素找到则跳转
    for handle in driver.window_handles:
    #切换新窗口
    driver.switch_to.window(handle)
    #判断当前窗口的特征是否为目标窗口
    eles=driver.find_elements_by_css_selector("span>[href='/course/explore']")
    if eles:
        eles[0].click()
        break

    7、清除元素中的字符串

        clear方法  :  input1.clear()

    8、获取文本框中输入的内容

        get_attribute() : 获取input元素里面输入的文本内容

        input1.get_attribute('value')

    9、单选框:type类型是radio

        type = "radio"

        click()方法选择 : 不管原来该元素是否选中,直接去点击该元素没有问题都可以确保该单选框选中

                  

    driver.find_element_by_css_selector("[value='male']").click()
    driver.find_element_by_css_selector("[value='female']").click()
     #是否被选中
    male = driver.find_element_by_css_selector("[value='male']")
    if male.is_selected:
      print ("单选框被选中")
    else:
      print ("未被选中")

    10、勾选框:type类型CheckBox

        type = "checkbox"

        click()方法选择 

        is_selected()方法来获取选择的状态:

            True :已经选中

            False:未选中

    ele1=driver.find_element_by_css_selector("[value='bike]'")
    #如果选中pass,未选中则让其点击选中
    if ele1.is_selected():
        pass
    else:
        ele1.click()
    
    #选中所有的勾选框
    eles=driver.find_elements_by_tag_name('input')
    for ele in eles:  
        #没有被选中,则让选中
        if not ele1.is_selected():
            ele1.click()

    11、复选框

        select,有multiple可以多选,不写则单选    

        可以用selenium的Select类

        导入类: from selenium.webdriver.support.ui import Select

        方法deselect_all() : 清掉所有选中的元素

        方法select_by_visible_text("值"):根据复选框中文本信息选中

    可以选择多个的复选框:

        实例如下:

    #导入Select类
    from selenium.webdriver.support.ui import Select
    #获得相应的WebElement
    select = Select(driver.find_element_by_id("multi"))
    #去除选择所有的选项
    select.deselect_all()
    select.select_by_visible_text("雅阁")
    select.select_by_visible_text("宝马 740")
    
    #获得相应的WebElement
    select = Select(driver.find_element_by_id("single"))
    select.select_by_visible_text("男")
    
    #其他几种选中复选框中内容的方法# 获得相应的WebElement
    select = Select(driver.find_element_by_id("select"))
    # 先取消选择所有的选项
    select.deselect_all()
    # 通过文本选中 玛莎拉蒂
    select.select_by_visible_text("玛莎拉蒂")
    # 通过 value 值选中 兰博基尼
    select.select_by_value("Lamborghini")
    # 通过 index 选择元素,索引从0开始
    select.select_by_index(2)

    只能选择单个复选框

    se2=Select(driver.find_element_by_id('single'))
    se2.select_by_value('male')

    12、获取标题

        driver.title

    13、获取当前url

        driver.current_url

    14、简单的断言

        assert driver.title == "百度一下,你就知道"     

       # 当前浏览器的标题是否是“百度一下,你就知道”

    15、截屏:

      截取整个页面的方法

          driver.get_screenshot_as_file(r'd:aidu.png')       

          # 括号里面填写文件名称,也可以固定保存路径

      获取某一个区域的图片

          ele=driver.find_element_by_cas_selector('img[class="d-flag"]')

          ele.screenshot(r'D:music.png')

    16、上传文件,调用系统的Windows框去上传

    需要依赖的第三方库:  pip  install  pypiwin32

    import time
    import win32com.client
    from selenium import webdriver
    
    # 打开浏览器
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://tinypng.com/")
    driver.find_element_by_css_selector(".icon").click()
    # 因为页面控件和Windows自带的框不一致,因此需要等待让系统的弹窗出来
    time.sleep(3)
    
    #开始上传文件,调用Windows窗口
    shell = win32com.client.Dispatch("WScript.Shell")
    # 输入需要上传文件的路劲,回车换行
    shell.SendKeys(r"E:	est.txt"+"
    ")
    time.sleep(3)
    driver.quit()

    17、浏览器的操作,刷新页面、前进、后退

    • 刷新页面  refresh
    • 前进:forward
    • 后退:back
    import time
    from selenium import webdriver
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.implicitly_wait(10)
    driver.get("https://www.baidu.com")
    print(driver.title)
    driver.find_element_by_id("kw").send_keys("自动化测试
    ")
    #后退
    driver.back()
    time.sleep(3)
    print(driver.title)
    #刷新页面
    driver.refresh()
    time.sleep(3)
    #前进
    driver.forward()
    time.sleep(3)
    print(driver.title)
    driver.quit()
    

     18、滑动屏幕,改变窗口默认大小

      

    import time
    from selenium import webdriver
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.implicitly_wait(10)
    driver.get("https://music.163.com/")
    #设置浏览器的窗口大小
    driver.set_window_size(480,500)
    time.sleep(2)
    #操作搜索框
    driver.find_element_by_id("srch").send_keys("周杰伦
    ")
    input()
    driver.quit()

     报错:message:element not interactable 表示这个元素在页面上不可见,需要拖动下拉框才能看到这个元素,

    这个时候需要让元素在页面上可见,才可操作

    • 需要将页面最大化去操作: driver.maxmize_window()

    滚动条:

      1.使用js,有时候页面禁止了js脚本,则需要用其他方法2

        可以现在浏览器中验证一下,如果不确定是否可以滑到最下面,

                   可以加个循环多滑动几次。

          

    from selenium import webdriver
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.implicitly_wait(10)
    driver.get("https://www.baidu.com/")
    #操作搜索框
    driver.find_element_by_id("kw").send_keys("松勤
    ")
    #滚动页面,js方法
    driver.execute_script("scrollBy(0,2000)")
    #点击下一页
    driver.find_element_by_css_selector("#page>a:nth-child(10)").click()
    driver.quit() 

     滚动条:直接滑到页面底部和顶部

    #滚动条操作
    # 直接滑动到底部
    js="var q=document.documentElement.scrollTop=10000"
    # 直接滑动到顶部
    js="var q=document.documentElement.scrollTop=0"
    driver.execute_script(js)

     2. 模拟键盘

         需要导入库:   

        import win32api

        import win32con

    import time
    import win32api
    import win32con
    from selenium import webdriver
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://music.163.com/")
    driver.implicitly_wait(10)
    driver.switch_to.frame("g_iframe")
    time.sleep(1)
    #需要点击一下空白页面,交互一下
    driver.find_element_by_css_selector(".v-hd3 .f-fl").click()
    time.sleep(1)
    for i in range(5): #循环5次,按键盘向下键
        win32api.keybd_event(win32con.VK_DOWN,0)
        time.sleep(0.5)
    for i in range(5): #循环5次,按键盘向上键
        win32api.keybd_event(win32con.VK_UP,0)
        time.sleep(0.5)
    for i in range(5): #循环5次,按键盘空格键
        win32api.keybd_event(win32con.VK_SPACE,0)
        time.sleep(0.5)
    for i in range(5):  # 循环5次,按键盘向右键
        win32api.keybd_event(win32con.VK_RIGHT, 0)
        time.sleep(0.5)
    for i in range(5): #循环5次,按键盘向左键
        win32api.keybd_event(win32con.VK_LEFT,0)
        time.sleep(0.5)
    driver.quit()
    

      3.获取窗口大小

        size=driver.get_window_size() #返回的是一个字典,可以通过键值对的思路去获取数据

    import time
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.implicitly_wait(10)
    driver.get("https://www.baidu.com/")
    #设置窗口大小
    driver.set_window_size(1400,500)
    time.sleep(1)
    #获取窗口大小信息,返回的是一个字典
    size=driver.get_window_size()
    print(size)
    print("{},height:{}".format(size['width'],size['height']))
    driver.quit()

     19、页面的二次渲染后,再次定位元素

     一般情况下报错:stale  element  reference表示页面进行了二次渲染

    解决方法,可以将触发的这个按钮再次定位,去触发,比如下面的删除按钮,

    放到循环里面,让其每次触发。

      

     20、模拟鼠标悬停,拖动

     需要导入ActionChains类:

    from selenium.webdriver.common.action_chains import ActionChains
    ac = ActionChains()
    # click需要传入需要操作的元素,返回的都是自己本身,因此可以连续调用,
    # 需要执行的话必须有perform()方法
    ac.click(input1).send_keys("input1").click(input2).send_keys("input2").
    click(input3).send_keys("input3").perform()
    # 定位到需要悬停的元素
    move = driver.find_element_by_id("XXXXX")
    # 对定位到的元素执行悬停操作
    ActionChains(driver).move_to_element(move).perform()

    #拖动
    #两个参数,拖动的起点和终点,鼠标按下的位置和鼠标松开的位置
    ac.drag_and_drop(soure,target)

    21、冻结页面

            某些元素在页面无法定位,则需要冻结页面,相当于加了一个debug,几秒后冻结窗口

      #多少秒之后对页面进行冻结

      setTimeout(function(){debugger},3000)

            

    23、让系统发出声音,提示用户做一些操作

    import  winsound

    winsound.Beep(2200,3000) #(声音频率,声音时间)

    例如:输入验证码,让系统发出一段声音,提示人去完成验证码的工作

    import  winsound
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.implicitly_wait(10)
    driver.get("https://www.baidu.com/")
    #系统自动提示声音,(分贝,延长时间)
    winsound.Beep(1000,8000)
    driver.quit()
    

      

    弹出对话框:

    对话框一般来说有三种:

      alert,confirm,prompt

    操作方法:

    driver.switch_to.alert.accept()      #点击OK

    driver.switch_to.alert.text      # 得到对话框内容

    driver.switch_to.alert.dismiss()   # 点击cancel

    driver.switch_to.alert.send_keys()   # 输入内容

    1、alert对话框

     

    # 针对这种对话框,python提供了一种方式,alert
    #触发alert
    driver.find_element_by_id('b1').click()
    #切换到alert框上面
    al = driver.switch_to.alert
    #获取alert框上面的信息
    print(al.text)
    #使用accept方法点击“确定”
    al.accept()
    

    2、confirm对话框

    # 针对这种对话框,python提供了一种方式,alert
    #触发alert
    driver.find_element_by_id('b2').click()
    #切换到alert框上面
    al = driver.switch_to.alert
    #获取alert框上面的信息
    print(al.text)
    #使用accept方法点击“确定”
    al.accept()
    #使用dismiss方法点击“取消”
    al.dismiss()
    

    3. prompt对话框

    driver.find_element_by_id('b3').click()
    driver.switch_to.alert.send_keys("hello  promot")
    driver.switch_to.alert.accept()
    driver.switch_to.alert.dismiss()

    后面有新增的内容,可以继续补充。。。。。。

    欢迎大家可以提更多的建议。。。。。。

  • 相关阅读:
    判断的几种结构
    关于电脑的基础单词笔记
    JAVA插入数据笔记
    完全卸载oracle11g步骤
    hibernate框架
    Java中的字符串比较
    java集合 list与Set、Map区别
    向MyEclipse的项目中导入js文件时,出现小红叉
    Java基础面试题
    java面试题 -- JVM
  • 原文地址:https://www.cnblogs.com/yangguanghuayu/p/11496686.html
Copyright © 2020-2023  润新知