基于python的selenium两种文件上传操作
<h2><span style="font-size: 16px"><strong>方法一、input标签上传</strong></span></h2><p><span style="font-size: 16px"><strong> </strong></span><strong> </strong>如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径,这里不做过多赘述,前文有相关操作方法。</p>
<h2><span style="font-size: 16px"><strong>方法二、非input标签上传</strong></span></h2>
<p> 这种上传方式需要借助第三方工具,主要有以下三种情况:</p>
<p> 1.AutoIt 去调用它生成的au3或者exe格式的文件</p>
<p> 2.SendKeys第三方库(目前只支持到2.7版本)</p>
<p> 网址:https://pypi.python.org/pypi/SendKeys/</p>
<p> 3.Python的pywin32库,通过识别对话框句柄来进行操作</p>
<p> pywin32库的安装因为文件较大,建议使用豆瓣源直接pip安装:</p>
<div class="cnblogs_code">
<pre>pip install -i https://pypi.douban.com/simple pywin32</pre>
</div>
<p> 前两种在这里不考虑,只采用第三种方法即可,使用之前可以借助工具winspy来辅助定位,winspy下载地址:https://sourceforge.net/projects/winspyex/</p>
<p> winspy工具的定位方法采用的是绝对路径定位,即<span style="background-color: rgba(255, 255, 0, 1); color: rgba(255, 0, 0, 1)">根路径为点击上传按钮后的弹出框的整个窗口页面</span>,一般<span style="color: rgba(255, 0, 0, 1); background-color: rgba(255, 255, 0, 1)">根据Text文本值和Class属性来定位</span>,如图所示:</p>
<p><img src="https://img2018.cnblogs.com/blog/1771019/201909/1771019-20190919000328683-1584185866.png" alt=""></p>
<p> 根路径如图所示,它的Text文本值为“打开”,Class属性值为“#32770”。</p>
<p><img src="https://img2018.cnblogs.com/blog/1771019/201909/1771019-20190919000836475-1830435342.png" alt=""></p>
<p> 在winspy工具左上角有个聚焦按钮,通过拖动的方式拖动到上传弹出框的对应位置(如文件路径输入框)后松开,winspy界面会显示当前定位的Text文本值(此处为空)和Class属性值(Edit),在windows的窗口下,Parent属性的值中,括号里面的就表示它上一层元素的Class属性值,可以通过点击Parent属性值跳到上一层元素,最终我们定位到文件路径输入框的Class属性路径为:<span style="color: rgba(255, 0, 0, 1); background-color: rgba(255, 255, 0, 1)">Edit - combox - comboBoxEx32 - #32770</span>。</p>
<p><img src="https://img2018.cnblogs.com/blog/1771019/201909/1771019-20190919000605107-516176547.png" alt=""></p>
<p> <img src="https://img2018.cnblogs.com/blog/1771019/201909/1771019-20190919000646618-183694139.png" alt=""></p>
<p> 那么同理,“打开”按钮通过同样的绝对路径方式定位,得到它的Class属性路径为:<span style="color: rgba(255, 0, 0, 1); background-color: rgba(255, 255, 0, 1)">button - #32770</span>。</p>
<p><img src="https://img2018.cnblogs.com/blog/1771019/201909/1771019-20190919000930513-1795851644.png" alt=""></p>
<p> 通过借助winspy工具定位出了对应元素的路径,就可以通过pywin32库来实现上传操作啦!</p>
<p> pywin32的实现步骤为:</p>
<p> 1、找到绝对路径输入框和“打开”按钮的元素;</p>
<p> 2、输入绝对路径,点击打开</p>
<p><em id="__mceDel"> </em>在页面实现的前提条件为 :windows上传窗口已经出现,可以sleep1~2秒等待上传的弹框出现。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> win32gui
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> win32con
</span><span style="color: rgba(0, 0, 255, 1)">def</span> upload(filePath, browser_type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">chrome</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">):
</span><span style="color: rgba(128, 0, 0, 1)">'''</span><span style="color: rgba(128, 0, 0, 1)">
通过pywin32模块实现文件上传的操作
:param filePath: 文件的绝对路径
:param browser_type: 浏览器类型(默认值为chrome)
:return:
</span><span style="color: rgba(128, 0, 0, 1)">'''</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> browser_type.lower() == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">chrome</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">:
title </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">打开</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">elif</span> browser_type.lower() == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">firefox</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">:
title </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">文件上传</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">elif</span> browser_type.lower() == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ie</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">:
title </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">选择要加载的文件</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
title </span>= <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 这里根据其它不同浏览器类型来修改</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 找元素</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 一级窗口"#32770","打开"</span>
dialog = win32gui.FindWindow(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">#32770</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, title)
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 向下传递</span>
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ComboBoxEx32</span><span style="color: rgba(128, 0, 0, 1)">"</span>, None)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 二级</span>
comboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ComboBox</span><span style="color: rgba(128, 0, 0, 1)">"</span>, None) <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 三级</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 编辑按钮</span>
edit = win32gui.FindWindowEx(comboBox, 0, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Edit</span><span style="color: rgba(128, 0, 0, 1)">'</span>, None)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 四级</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 打开按钮</span>
button = win32gui.FindWindowEx(dialog, 0, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Button</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">打开(&O)</span><span style="color: rgba(128, 0, 0, 1)">"</span>)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 二级</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 输入文件的绝对路径,点击“打开”按钮</span>
win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filePath)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 发送文件路径</span>
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 点击打开按钮</span></pre>
</div>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
<div>作者:小公瑾</div>
<div>出处:https://www.cnblogs.com/xiaogongjin/</div>
<p>-------------------------------------------</p>
<p>个性签名:不忘初心,方得始终!</p>
<p>如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个<span>“推荐”</span>哦,博主在此感谢!</p>
<p></p><br><br>
来源:https://www.cnblogs.com/xiaogongjin/p/11546518.html
頁:
[1]