含 selenium Python:从文件系统拖放到webdriver?

sqougxex  于 2022-12-18  发布在  Python
关注(0)|答案(2)|浏览(127)

我必须自动化一个Web应用程序,它包含一个用于从本地文件系统上传文件的拖放区域。我的测试环境是使用Python开发的。对于自动化测试,我使用了Selenium,但是一旦上传区域是一个div标签(没有input标签--我知道这样会很容易),就不可能从文件系统中拖动文件。
我读了很多不同的文章,但到目前为止没有一篇适合我,需要强调的是,我对使用AutoIT不感兴趣,我只对使用selenium的原生python感兴趣。
我发现了 selenium :从文件系统拖放到webdriver?什么看起来真的很有前途,但我不知道适应Python。
先谢谢你了!

t1qtbnec

t1qtbnec1#

下面是这个技巧的python版本,通过脚本进行输入注入。

JS_DROP_FILE = """
    var target = arguments[0],
        offsetX = arguments[1],
        offsetY = arguments[2],
        document = target.ownerDocument || document,
        window = document.defaultView || window;

    var input = document.createElement('INPUT');
    input.type = 'file';
    input.onchange = function () {
      var rect = target.getBoundingClientRect(),
          x = rect.left + (offsetX || (rect.width >> 1)),
          y = rect.top + (offsetY || (rect.height >> 1)),
          dataTransfer = { files: this.files };

      ['dragenter', 'dragover', 'drop'].forEach(function (name) {
        var evt = document.createEvent('MouseEvent');
        evt.initMouseEvent(name, !0, !0, window, 0, 0, 0, x, y, !1, !1, !1, !1, 0, null);
        evt.dataTransfer = dataTransfer;
        target.dispatchEvent(evt);
      });

      setTimeout(function () { document.body.removeChild(input); }, 25);
    };
    document.body.appendChild(input);
    return input;
"""

def drag_and_drop_file(drop_target, path):
    driver = drop_target.parent
    file_input = driver.execute_script(JS_DROP_FILE, drop_target, 0, 0)
    file_input.send_keys(path)

drop_target传递给它一些在页面上可见的元素时,你可以使用driver.get_element_by_...家族中的任何函数来获取这些元素。
方法是使用selenium的execute_script函数调用javascript来模拟拖放事件。

  1. selenium 调用javascript代码
  2. javascript创建input元素并将其附加到DOM
  3. JavaScript将处理程序附加到输入,该处理程序模拟当用户实际放下文件时发生的鼠标事件,即dragenterdragoverdrop
  4. selenium用文件的路径更新输入。2此时调用步骤2中的处理程序并模拟拖放事件。
tzdcorbm

tzdcorbm2#

我知道这可能是一个迟来的答案,但以防万一的人谁找到答案!
如果您使用的是Chrome,请go to this site下载Chrome驱动程序。(尝试找到您的Chrome版本thru this并选择合适的版本)
你还需要做一件事我现在就给你看

首先:下载chrome驱动程序并复制Xpath

步骤1:转到您想要的网站,并复制您的“拖放”的完整XPath,右键单击拖放区域,然后点击检查。

请这样做两次,以防它检查对地方

第2步:您将看到突出显示的颜色,再次右键单击它们

然后你会发现“复制”-〉“复制完整的Xpath”

最后,让我们编写代码

等等!!!还有一个建议:如果您看到粘贴“Xpath”或“link to the folder”时出现问题for example
您可以使用“”代替““

from selenium import webdriver
driver = webdriver.Chrome('D:\Folder\chromedriver')
driver.get('https://exmaple.com')
drag_&_drop = driver.find_element_by_xpath('paste-the-full-xpath-here')
drag_&_drop.send_keys('D:\Folder\picture.png')
#python 3.9

相关问题