美文网首页
selenium实用技巧

selenium实用技巧

作者: 清水秋香 | 来源:发表于2020-02-19 12:55 被阅读0次
    • 切换窗口:
      driver.switch_to.window(handle)
      如何获取handel?
      通过driver.window_handles 方法获取当前浏览器所有窗口的handle
      通过循环切换窗口判断标题的方法来确定当前窗口是否为目标窗口
      保留当前窗口handle
      driver.current_window_handle
      关闭窗口的方法:driver.close()用于关闭当前窗口

    • 对话框处理:
      driver.switch_to.alter
      1.alter :
      点击确定:accept()
      获取文本:text
      2.confirm:
      点击确定:accept()
      获取文本:text
      点击取消:dismiss()
      3.prompt
      点击确定:accept()
      获取文本:text
      点击取消:dismiss()
      输入内容:send_keys()

    from selenium import webdriver
    import time
    #alert
    driver = webdriver.Chrome()
    driver.get('file:///Users/wgz/Desktop/%E6%9D%BE%E5%8B%A4/%E8%87%AA%E5%8A%A8%E5%8C%96%E7%BB%83%E4%B9%A0/al.html')
    driver.find_element_by_id('b1').click()
    al = driver.switch_to.alert
    time.sleep(3)
    al.accept()
    time.sleep(3)
    
    #confirm
    driver.find_element_by_id('b2').click()
    al=driver.switch_to.alert
    time.sleep(3)
    al.accept()
    time.sleep(3)
    driver.find_element_by_id('b2').click()
    al=driver.switch_to.alert
    time.sleep(3)
    al.dismiss()
    time.sleep(3)
    
    # prompt
    driver.find_element_by_id('b3').click()
    al = driver.switch_to.alert
    time.sleep(3)
    al.dismiss()
    time.sleep(3)
    driver.find_element_by_id('b3').click()
    al = driver.switch_to.alert
    time.sleep(3)
    al.accept()
    time.sleep(3)
    driver.find_element_by_id('b3').click()
    al = driver.switch_to.alert
    time.sleep(3)
    al.send_keys('hahaha')
    time.sleep(3)
    al.accept()
    time.sleep(3)
    driver.quit()
    

    注意浏览器alter和普通html弹出框的区别

    • 上传文件:
      直接发送键盘消息给当前应用程序。
      前提是浏览器必须是当前应用
      此方法只在windows环境有用
      pip install pypiwin32
      获取shell对象
      shell = win32com.client.Dispatch("Wscript.Shell")
      有的系统要加'\r'
      有的系统要加'\r\n'
      使用shell对象的Sendkeys方法给应用程序发送字符串
      shell.Sendkeys(r"d:\button.png"+'\n')
    from selenium import webdriver
    import time
    driver = webdriver.Chrome(r'C:\Users\Win10\Desktop\chromedriver.exe')
    driver.get('https://tinypng.com/')
    driver.find_element_by_class_name('icon').click()
    time.sleep(5)
    import win32com.client
    shell = win32com.client.Dispatch("WScript.shell")
    shell.Sendkeys(r'C:\Users\Win10\Desktop\n.png'+'\n')
    

    注意:输入法调成英文的,这个方法时发送字符串到当前的焦点程序,所以自动化时不要做其他操作。

    • 滚动屏幕
      如果窗口太长,改变窗口大小都不够,因为屏幕只有那么大,需要滚动到元素的方案,可以使用最后一招,直接让浏览器执行javascript脚本
      浏览器执行的语言是js,如果我们能直接传入js让浏览器执行,
      就得到了最大的灵活性去控制浏览器。
      window.scroolBy(250,0)横向滚动250像素
      让浏览器去执行
      driver.execute_scrirt('window.scrollBy(250,0)')
    from selenium import webdriver
    driver=webdriver.Chrome()
    driver.get('http://news.baidu.com/')
    #一边滑动一边查找元素---循环
    #不知道滑动多少次---无限循环
    while True:
        driver.execute_script('window.scrollBy(0,200)')
        #需要循环结束条件是找到目标元素
        targeteles=driver.find_elements_by_css_selector('#guonei .l-left-col>ul:nth-child(1)>li:nth-child(1) a')
        if targeteles:#如果找到了这个元素
            targeteles[0].click()
            break
    driver.quit()
    

    还可以使用键盘事件来完成该操作 注意先要获得页面焦点

    from selenium import webdriver
    import win32api
    import win32con
    
    driver=webdriver.Chrome()
    driver.get('https://music.163.com/')
    driver.switch_to.frame('g_iframe')
    driver.find_element_by_css_selector('#discover-module .g-wrap3 .n-rcmd .v-hd2').click()
    time.sleep(1)
    #模拟向下滚动页面20次
    for i in range(20):
        win32api.keybd_event(win32con.VK_DOWN, 0)
        time.sleep(0.5)
    input('xxxxxxx')
    driver.quit()
    
    • 二次渲染
    import time
    from selenium import webdriver
    driver=webdriver.Chrome()
    driver.implicitly_wait(10)
    driver.get('http://localhost/mgr/ps/mgr/index.html#/')
    def add_course():
        #点击添加课程
        driver.find_element_by_css_selector('[ng-click="showAddOne=true"]').click_element()
        #输入课程名称
        driver.find_element_by_css_selector('[ng-model="addData.name"]').send_keys('selenium课程')
        #输入课程描述
        driver.find_element_by_css_selector('[ng-model="addData.desc"]').send_keys('课程描述')
        #输入展示次序
        driver.find_element_by_css_selector('[ng-model="addData.display_idx"]').send_keys('1')
        #点击创建
        driver.find_element_by_css_selector('[ng-click="addOne()"]').click_element()
        time.sleep(3)
    
    def DeleteAllReacher(driver):
        delButtons = driver.find_element_by_css_selector('*[ng-click^=delOne]')
        for button in delButtons:
            button.click()
            driver.find_element_by_css_selector('.modal-footer .btn-primary').click()
    
    
    if __name__ == '__main__':
        delete_allCourse()#初始化-清除课程
        add_course()
        delete_allCourse()#清除动作-清除测试产生的数据
    

    运行结果发现selenium.common.exceptions.SraleElementReferenceException: MEssage:stale element reference:element is not attached to the page document

    原来是现在的web应用和以前大不相同,以前的web应用是直接残生最终的html界面
    而现在,很多事页面加载完成后(也加载js前端代码),由前端代码动态改变界面的内容,比如从后端获取一些数据后,在动态改变界面的内容。

    尤其是很多采用了框架像 angular ,react , vue 这些都会这样做。
    这样就会有一个问题,开始的时候获取的html只是一个模版一样的文档,里面的数据没有产生,而是等前端js代码动态的再次向后端查询数据后,才动态的向html模版中填入数据或者修改数据;
    原因是:一下子获取了多个删除按钮元素,然后用循环点击每个删除按钮但是当点击第一个按钮之后,页面有些部分被更新了,剩余的几个按钮,虽然看起来还是原来的样子,但是已经是新的界面元素了。
    所以通过原来老得界面元素点击,就会出现这个错误
    既然点击第一个课程的删除按钮后,页面部分被更新了,就只好重新获取界面元素。

    def DeleteAllcourse(driver):
        driver.implicitly_wait(2)
        while True:
            delbuttons = driver.find_elements_by_css_selector('*[ng-click^=delOne]')
            if len(delButtons) < 1:
                break
            delButtons[0].click()
            driver.find_element_by_scc_selector('.modal-footer .btn-primary').click()
            time.sleep(1)  
    
    import time
    import win32api
    import win32con
    
    # shell = win32com.client.Dispatch("WScript.Shell")
    #模拟5次下方向键
    # for i in range(5):
    #     win32api.keybd_event(win32con.VK_DOWN, 0)
    #     time.sleep(0.5)
    
    #模拟向下的按键
    win32api.keybd_event(win32con.VK_DOWN,0)
    #输入数字0
    win32api.keybd_event(win32con.VK_NUMPAD0,0)
    #模拟回车符号
    win32api.keybd_event(win32con.VK_RETURN, 0)
    #模拟空格
    win32api.keybd_event(win32con.VK_SPACE, 0)
    #模拟+
    win32api.keybd_event(win32con.VK_ADD, 0)
    
    • selenium 键盘事件
      keys()类提供了键盘上几乎所有案件的方法。前面了解到,send_keys方法可以用来模拟键盘输入,除此之外,我们好可以用它来输入键盘上的案件,甚至是组合键如ctrl+A等
    from selenium import webdriver
    
    from selenium.webdriver.common.keys import Keys
    
    driver = webdriver.Chrome()
    driver.get('http://www.baidu.com')
    
    
    #输入框输入内容
    driver.find_element_by_id('kw').send_keys('seleniumm')
    
    #删除多输入的一个m
    driver.find_element_by_id('kw').send_keys(Keys.BACK_SPACE)
    
    #输入空格键+'教程'
    driver.find_element_by_id('kw').send_keys(Keys.SPACE)
    driver.find_element_by_id('kw').send_keys('教程')
    
    #ctrl+a全选输入框内容
    driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a')
    
    #ctrl + x剪切输入框内容
    driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x')
    
    #ctrl+v 粘贴内容到输入框
    driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'v')
    
    #通过回车来代替点击操作
    driver.find_element_by_id('su').send_keys(Keys.ENTER)
    
    driver.quit()
    

    以下为常用的键盘操作:

    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)
    send_keys(Keys.CONTROL,'x')  剪切(Ctrl+X)
    send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
    send_keys(Keys.F1)    F1
    send_keys(Keys.F12)  F12
    
    • 鼠标事件
      用selenium做自动化,有时候会遇到需要模拟鼠标操作曹能进行的情况,比如单击、双击、点击鼠标右键、拖拽等等。而selenium给我们提供了一个类来处理这类事件--ActionChains
      ActionChains提供了鼠标操作的常用方法:
      perform(): 执行操作
      context_click(): 右击
      double_click(): 双击
      drag_and_drop(): 拖动
      move_to_element(): 鼠标悬停
    import time
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    above = driver.find_element_by_link_text('设置')
    ActionChains(driver).move_to_element(above).perform()
    time.sleep(3)
    driver.quit()
    

    相关文章

      网友评论

          本文标题:selenium实用技巧

          本文链接:https://www.haomeiwen.com/subject/dyrofhtx.html