流程节点参考:页面操作
1、新建标签
在浏览器分身中打开一个新的标签页
指令输入
--
指令输出
--
使用示例
--
2、关闭标签
在浏览器分身中关闭指定的标签页
《关闭标签》
指令输入
可以关闭当前标签页,也可关闭指定标签页(1代表第1个标签页,-n代表倒数第n个标签页),也可保留当前标签页而关闭所有其它标签页
指令输出
--
使用示例
--
3、激活标签
激活浏览器分身的指定标签页
《关闭标签》
指令输入
激活指定位置的标签页(1代表第1个标签页,-n代表倒数第n个标签页)
指令输出
--
使用示例
--
4、访问网址
在当前标签页中访问目标网站
《流程节点:访问网址》
指令输入
选项 | 说明 |
---|---|
网址 | 拟访问的网站,建议放上前缀 http:// 或者 https:// |
Refer | 从哪个网页链接过来 |
加载完毕的判断依据 | 可以是指定时间,也可以等待某个页面节点出现 |
网络异常的容错机制 | 当网页无法正常加载时,可以指定刷新页面的次数 |
指令输出
--
使用示例
--
5、刷新页面
刷新当前激活的标签页
《流程节点:刷新页面》
指令输入
选项 | 说明 |
---|---|
网页加载完毕的判断依据 | 可以是指定时间,也可以等待某个页面节点出现 |
指令输出
--
使用示例
--
6、滚动页面
在当前激活的标签页中进行滚动
《流程节点:滚动页面》
指令输入
选项 | 说明 |
---|---|
鼠标位置 | 拟在网页的哪个位置发送滚动事件,可以为空(为空时在整个页面的根容器 body 中发送事件) |
滚动位置 | 可滚动到页面的底部或者顶部 |
滚动距离 | 滚动多少像素位置 |
滚动到元素出现 | 滚动到某个网页元素出现在窗口可视范围内,使用此选项时请确保该网页元素已经被正确加载,否则会导致异常 距离顶部的位置:有些网页顶部有其它元素会挡住下层元素,如果将目标元素滚动到其它元素的下方可能会导致无法点击,使用此选项可以规避此问题 |
指令输出
--
使用示例
示例一:eBay的搜索页面采用缓加载机制,这意味着当需要遍历每一个搜索结果时,有可能遇到搜索结果没有被正常加载导致流程执行失败。 此时,可以先通过 滚动页面 节点,将页面滚动到最底部,确保每个搜索结果都已经被正常加载,然后再遍历搜索结果,流程编写如下图所示:
《滚动页面使用示例》
最终的流程执行效果如下图所示:
《滚动页面到底部的使用效果》
7、浏览器脚本
浏览器脚本节点可以在当前激活的标签页内执行一段JavaScript代码,用于实现一些RPA节点不易实现或者无法高效实现的功能,例如直接操作html节点,修改页面内JS变量的值等 (关于如何编写Javascript代码已经超越了本文内容,推荐您进一步阅读 JavaScript 教程)。
《浏览器脚本》
在花漾RPA中,浏览器脚本有两种写法,一种是提供一个单参数 ctx
的函数,RPA引擎负责在浏览器脚本里初始化并执行该函数:
(ctx) => {
// 请在此处书写代码,通过 ctx.params.{变量名} 来引用流程变量
console.log(window.location.href);
console.log(ctx.params.var_name); //假设我们有一个流程变量叫 var_name
}
另一种是直接书写代码块,引擎会直接在浏览器页面里执行该代码块:
alert('Hello World!');
console.log(var_name); //假设我们有一个流程变量叫 var_name
两种写法各有优缺点,直接代码块简洁,但使用函数的方法可以更好的避免流程变量名和页面变量名冲突的情况,
并且使用函数的方法支持 return
语句,可以显式的告知引擎该节点想返回什么(否则按照JS的语法规范,最后一个语句的值就是整个代码块的返回值)。
也正如你所见,我们新拖入浏览器脚本节点默认就写入一个函数。
示例1:使用变量
浏览器脚本里可以访问流程变量/输入变量的。但由于流程执行的环境是NodeJs环境,和浏览器所在的环境是两个不同的进程, 一些无法序列化(例如Excel对象)的或者是序列化代价太高 (例如二进制Buffer) 的变量是无法在浏览器脚本里访问到的。
(ctx) => {
//使用流程变量
console.log(ctx.params.var_name);
//修改流程变量
ctx.params.var_name = 1234;
}
示例2:异步使用
如果在浏览器脚本里有异步的操作的话就必须告知引擎,否则脚本会直接执行结束。告知的方式就是返回一个Promise,引擎会等待这个Promise resolve 或者 reject
//下面的代码是错误示范,ctx.params.var_name = data.name 并不会成功修改 var_name 的值,因为 $.ajax 是一个异步调用,整段代码很快就执行完毕,引擎不会等待 $.ajax 返回
(ctx) => {
$.ajax(some_url).then((data)=>{
ctx.params.var_name = data.name
});
console.log('ajax send');
}
//正确的写法如下:
(ctx) => {
let promise = $.ajax(some_url).then((data)=>{
ctx.params.var_name = data.name
});
console.log('ajax send');
//引擎会拿到这个promise,并且等待 promise 状态为 resolved
return promise;
}
示例3:引用代码片段
浏览器脚本节点的代码输入框设计只为写一些简单的代码,如果有复杂或者需要在多个浏览器脚本节点复用的代码,可以抽成代码片段。
(ctx) => {
const utils = require('utils.js');
utils.sayHi();
}
常见问题
- 浏览器引擎脚本执行在浏览器页面里,所以
console.log()
的输出需要在浏览器在F12控制台里查看,在流程日志里是看不到的 - 使用
setTimeout
等异步方式修改变量不会生效,因为程序已经返回了。除非返回一个Promise等待这个异步的修改完成
8、RPA引擎脚本
RPA引擎脚本是一段运行在nodejs沙箱里的Javascript代码,可以用来处理一些不方便用流程节点处理,或者用流程节点处理起来过于繁琐的逻辑。
相对于浏览器脚本,在RPA引擎脚本里可以非常方便的访问和修改所有
的流程变量
(关于如何编写Javascript代码已经超越了本文内容,推荐您进一步阅读 JavaScript 教程)。
《RPA引擎脚本》
使用示例
--