背景
项目中需要拖拽操作,使用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