selenium drag_and_drop不支持HTML5解决方法

背景

项目中需要拖拽操作,使用drag and drop,经测试并不生效,没有实现拖动,但是robotframework并不报错,原来是因为selenium并不支持对html5的拖拽操作,所以我们需要使用javascript来处理。

[drag_and_drop.js]

var dataTransfer =
    {
        dropEffect: '',
        effectAllowed: 'all',
        files: [],
        items: {},
        types: [],
        setData: function (format, data) {
            this.items[format] = data;
            this.types.append(format);
        },
        getData: function (format) {
            return this.items[format];
        },
        clearData: function (format) {
        }
    };
var emit = function (event, target) {
    var evt = document.createEvent('Event');
    evt.initEvent(event, true, false);
    evt.dataTransfer = dataTransfer;
    target.dispatchEvent(evt);
};

var DragNDrop = function (src, tgt) {
    src = document.getElementById(src);
    tgt = document.getElementById(tgt);
    emit('dragstart', src);
    emit('dragenter', tgt);
    emit('dragover', tgt);
    emit('drop', tgt);
    emit('dragend', src);
    return true;
}
  • 在robotframework中这样使用
Drag And Drop Element
    [Arguments]     ${src}  ${tgt}
    ${js}        Get File              drag-n-drop.js
    ${result}    Execute Javascript    ${js}; return DragNDrop("${src}", "${tgt}");
    Capture Page Screenshot
  • 可以看到我们参数是只支持id的,不过也不必紧张,我们可以使用robotframework自带的方法Assign Id To Element来生成一个临时id。这个临时id我们自己建个方法生成唯一的更好。

  • 所以改进后的代码如下,可以支持selenium支持的所有方式,而且id是唯一的,不用再去纠结id取值。

get uuid
    ${uuid}     evaluate    (uuid.uuid3(uuid.NAMESPACE_DNS, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + str(random.random()))).hex            modules=random, time, uuid
    [Return]        ${uuid}

Drag And Drop Element
    [Arguments]     ${src}  ${tgt}
    ${src_id}       get uuid
    ${tgt_id}       get uuid
    Assign Id To Element        ${src}           ${src_id}
    Assign Id To Element        ${tgt}           ${tgt_id}
    ${js}        Get File              drag-n-drop.js
    ${result}    Execute Javascript    ${js}; return DragNDrop("${src_id}", "${tgt_id}");
    Capture Page Screenshot

你可能感兴趣的:(selenium drag_and_drop不支持HTML5解决方法)