zoukankan      html  css  js  c++  java
  • Selenium 文件下载

    点击文件下载时,弹出的那个框,webdriver是定位不到的,只有通过第三方工具或方法来操作

    一、通过PyUserInput模拟键盘按键下载


    PyUserInput是模拟鼠标和键盘的一个模块,替代了python2 中的SendKeys模块。

    需要先安装:

    pip install PyUserInput

    如果用的是python3 32位版本,直接通过pip安装,可以安装成功;

    如果用的是puthon3 64位版本,那就比较悲催了,各种报错。

    1、查看本机python版本:

    2、安装PyUserInput

    如果是32位版本的python,那么就直接pip安装吧,下面的安装教程只针对64位版本的python

    直接报错:No matching distribution found for pyHook (from PyUserInput)

    既然直接用pip安装不了,那我们就通过pyHook来安装

    pyHook下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

    根据python版本来下载,如python3.6就下载cp36;python3.7就下载cp37

    下载轮子到本地后,直接用pip安装

    pip install C:UsersAdministratorDesktoppyHook-1.5.1-cp36-cp36m-win_amd64.whl

    继续去刚才那个网址下载pyWin32:

    下载完后pip安装

    pip install C:UsersAdministratorDesktoppywin32-223-cp36-cp36m-win_amd64.whl

    现在终于安装PyUserInput了

    pip install PyUserInput

    OK,没报错,安装成功。

    试一下:

    成功导入。

    我们以autoit的下载为例

    既然没办法直接定位到这个下载框,我们就模拟键盘发送Tab和Enter键来下载

    代码:

    # coding = utf-8
    from selenium import webdriver
    from time import sleep
    from pykeyboard import PyKeyboard
    # 驱动文件路径
    driverfile_path = r'D:coshipTest_FrameworkdriversIEDriverServer.exe'
    # 启动浏览器
    driver = webdriver.Ie(executable_path=driverfile_path)
    driver.get(r'https://www.autoitscript.com/site/autoit/downloads/')
    driver.maximize_window()
    driver.implicitly_wait(20)
    # 拖动滚动条到页面中部
    js = "var q=document.body.scrollTop=55555"
    driver.execute_script(js)
    sleep(2)
    driver.find_element_by_css_selector("img[title='Download AutoIt']").click()
    # 建立一个键盘对象
    sleep(2)
    k = PyKeyboard()
    # 按两次Tab键,焦点定位到“运行”按钮上
    k.press_key(k.tab_key)
    sleep(1)
    k.press_key(k.tab_key)
    # 按下Enter键,开始下载
    sleep(1)
    k.press_key(k.enter_key)
    # 退出
    sleep(5)
    driver.quit()

    二、通过AutoIt下载


    我们还可以通过AutoIt工具(不知道这个工具怎么用的请查看 Selenium 文件上传

    通过AutoIt Windows Info工具获得以下信息:

    • 窗口的Title为“文件下载 - 安全警告”,Class为“#32770”“保存”按钮的ClassnameNN为"Button2"
    • ”文件名”路径输入框的ClassnameNN为"Edit1"
    • 保存窗口的Title为“另存为”,Class为“#32770”
    • “保存”按钮的ClassnameNN为"Button1"

    根据以上信息编写脚本:

    ControlGetFocus("文件下载 - 安全警告")
    ControlFocus ( "文件下载 - 安全警告", "", "" )
    ControlFocus ( "文件下载 - 安全警告", "保存(&S)", "Button2")
    Sleep(2000)
    ControlClick ( "文件下载 - 安全警告", "保存(&S)", "Button2","left",1)
    WinWaitActive("另存为")
    ControlGetFocus("另存为")
    ControlFocus ("另存为", "", "" )
    ;获取下载包的名称
    $text=ControlGetText("另存为","","Edit1")
    ;输入保存路径
    ControlSend("另存为","","Edit1","C:UsersAdministratorDesktop	est"&$text)
    Sleep(2000)
    ControlFocus ("另存为", "保存(&S)", "Button1")
    ControlClick ("另存为", "保存(&S)", "Button1" )
    Sleep(2000)
    ;当前路径下如果有重名的文件则替换
    If WinExists("确认另存为","") Then
      WinWaitActive("确认另存为")
      ControlGetFocus("确认另存为")
      ControlFocus ("确认另存为", "", "" )
      ControlFocus ("确认另存为", "是(&Y)", "Button1")
      ControlClick ("确认另存为", "是(&Y)", "Button1" )
    EndIf

    生成exe文件,再用python调用

    代码:

    # coding = utf-8
    from selenium import webdriver
    from time import sleep
    import os
    # 驱动文件路径
    driverfile_path = r'D:coshipTest_FrameworkdriversIEDriverServer.exe'
    # 启动浏览器
    driver = webdriver.Ie(executable_path=driverfile_path)
    driver.get(r'https://www.autoitscript.com/site/autoit/downloads/')
    driver.maximize_window()
    driver.implicitly_wait(20)
    # 拖动滚动条到页面中部
    js = "var q=document.body.scrollTop=55555"
    driver.execute_script(js)
    sleep(2)
    driver.find_element_by_css_selector("img[title='Download AutoIt']").click()
    # 调用downfile.exe
    os.system(r"C:UsersAdministratorDesktopdownfile.exe")
    # 退出
    sleep(60)
    driver.quit()

     三、FireFox浏览器下载


    通过FireFox浏览器来下载文件时,可以设置其Profile:

    • browser.download.dir:指定下载路径
    • browser.download.folderList设置成 0 表示下载到桌面;设置成 1 表示下载到默认路径;设置成 2 表示使用自定义下载路径;
    • browser.download.manager.showWhenStarting:在开始下载时是否显示下载管理器
    • browser.helperApps.neverAsk.saveToDisk:对所给出文件类型不再弹出框进行询问

    代码:

    # coding = utf-8
    from selenium import webdriver
    from time import sleep
    # 驱动文件路径
    driverfile_path = r'D:coshipTest_Frameworkdriversgeckodriver.exe'
    # 设置profile
    profile = webdriver.FirefoxProfile()
    # 设置下载路径
    profile.set_preference("browser.download.dir",r"C:UsersAdministratorDesktop	est")
    # 设置成 2 表示使用自定义下载路径;设置成 0 表示下载到桌面;设置成 1 表示下载到默认路径
    profile.set_preference("browser.download.folderList",2)
    # 是否显示下载管理器
    profile.set_preference("browser.download.manager.showWhenStarting",False)
    # 设置成不弹框
    profile.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream")
    # 启动浏览器
    driver = webdriver.Firefox(executable_path=driverfile_path,firefox_profile=profile)
    driver.get(r'https://www.autoitscript.com/site/autoit/downloads/')
    driver.maximize_window()
    driver.implicitly_wait(20)
    # 拖动滚动条到显示下载按钮的地方
    target = driver.find_element_by_css_selector("img[title='Download AutoIt']")
    driver.execute_script("arguments[0].scrollIntoView();", target)
    sleep(2)
    driver.find_element_by_css_selector("img[title='Download AutoIt']").click()
    # 退出
    sleep(60)
    driver.quit()

    Firefox需要针对每种文件类型进行设置,这里需要我们查询对应文件的MIME类型,可以用以下链接进行查询:MIME 参考手册

    四、Chrome浏览器下载


    通过Chrome浏览器来下载文件时,需设置options:

    • download.default_directory:设置下载路径
    • profile.default_content_settings.popups:设置为 0 禁止弹出窗口

    代码:

    # coding = utf-8
    from selenium import webdriver
    from time import sleep
    # 驱动文件路径
    driverfile_path = r'D:coshipTest_Frameworkdriverschromedriver.exe'
    # 设置options
    options = webdriver.ChromeOptions()
    # 设置下载路径
    prefs = {"profile.default_content_settings.popups":0,"download.default_directory":r"C:UsersAdministratorDesktop	est"}
    options.add_experimental_option("prefs",prefs)
    # 启动浏览器
    driver = webdriver.Chrome(executable_path=driverfile_path,chrome_options=options)
    driver.get(r'https://www.autoitscript.com/site/autoit/downloads/')
    driver.maximize_window()
    driver.implicitly_wait(20)
    # 拖动滚动条到显示下载按钮的地方
    target = driver.find_element_by_css_selector("img[title='Download AutoIt']")
    driver.execute_script("arguments[0].scrollIntoView();", target)
    sleep(2)
    driver.find_element_by_css_selector("img[title='Download AutoIt']").click()
    # 退出
    sleep(60)
    driver.quit()
  • 相关阅读:
    mysql 优化20点
    java function
    设计模式 概览
    Linux安装java1.8并配置环境变量
    windows下一次执行多个sql文件
    mybatis查询结果为空时的返回值问题
    Java中Json与String互转
    SSM Service自动注入失败
    本地安装Mysql5.7过程中出现的一系列问题
    解决本地工具无法连接服务器上的mysql的问题
  • 原文地址:https://www.cnblogs.com/eastonliu/p/9118959.html
Copyright © 2011-2022 走看看