我在本地和远程(通过VPN)与GUI应用程序进行交互。当我在本地使用它时,大多数动作发生得非常快,我的sikuli脚本执行得很好。但是,当我远程使用它时,操作需要更长时间才能完成。
也就是说,Sikuli可能会检测到要等待的屏幕和元素,但光标仍然处于忙碌状态。 (例如,窗口中的旋转圆圈)。这导致我的sikuli脚本在远程使用应用程序时因为增加的"滞后" (不确定这是否适合它)。
例如,如果我做了
wait(laggy_field.jpg)
click(laggy_field.jpg)
type("so laggy")
Sikuli将等待laggy_field。将出现Laggy_field但光标仍将忙碌。但是,sikuli似乎并未意识到这一点,并将curosr移动到现场并单击该字段。结果是焦点不在该字段上,因为光标实际上处于忙/不活动状态。因此,类型(" so laggy")命令导致密钥被发送到任何地方。
如果我在等待和点击命令之间等待30秒的任意时间,那么脚本将会工作"但我本来希望有一个更优雅的解决方案。似乎检测鼠标指针变化的能力离Sikuli's roadmap
有点远答案 0 :(得分:0)
不太确定问题是什么,但这里有几点建议:
(1)你确定你的脚本看到了laggy_field吗?
wait(laggy_field.jpg)
hover(laggy_field.jpg)
click(laggy_field.jpg)
type("so laggy")
如果鼠标没有移动到laggy_field,则需要增加wait()指令的超时。请参阅下面我在laggy_field.jpg等待最多10秒的地方
wait(laggy_field.jpg, 10)
(2)如果插入任意等待时间,点击是否有效?
wait(laggy_field.jpg, 10)
hover(laggy_field.jpg)
wait(10)
click(laggy_field.jpg)
type("so laggy")
(3)尝试用等待正确的鼠标指针替换等待(10)(从滞后字段框中的悬停位置取出jpg)?
wait(laggy_field.jpg, 10)
hover(laggy_field.jpg)
wait(laggy_not_busy_mouse.jpg, 10)
click(laggy_field.jpg)
type("so laggy")
答案 1 :(得分:0)
摆脱由于滞后导致的脚本执行失败的最好方法是等待特定的图像模式,你可以写这样的东西
虽然不存在('some_image.jpg'):等等 ..执行下一步
注意: 这个wait方法没有参数 一旦满足此条件,您就不必依赖于使用sleep(x)等明确提及时序。
您需要识别应用程序中的特定图像,直到下一步执行没有执行。 因此你可以在你的sikuli脚本中不存在循环标准。
答案 2 :(得分:0)
很抱歉去挖掘,但我想出了一个让这个更简单的课程。它使用exact()
方法从"模糊"中更改匹配算法。更精确的算法。
class Element:
def __init__(self, element, region):
self.element = element
self.region = region
def stateChanged(self):
if self.region.exists(Pattern(self.element).exact()):
return False
return True
用法:
gmailEmailField = Element("1458930208197.png", Region(438,239,388,342))
while not gmailEmailField.stateChanged():
wait(.5)
如果应用程序中的每个元素都没有响应,请执行此操作。通过这种方式,您可以确保填充元素,或者在应用程序再次响应时跟踪它,因为它使用完全匹配。