重要 - 同步类型(),mouseclick()等

最后编辑了

一个有问题的例子

type()命令(以及其他命令)向应用程序发送密钥或鼠标事件。例如:

import names

def main():
    startApplication("my_application")
    #...

    type(waitForObject(names.Article_Name_TextField), "My new article x")
    test.compare(waitForObject(names.Error_Label).text, "本文已经存在!")
test.py.

此测试脚本意味着有一个用于输入新文章的TextField对象’s name,并且有一个标签对象显示输入的文章名称已存在的错误消息。

但是,此脚本存在潜在的问题:

因为一般不可能知道应用程序何时收到或已经完成处理密钥事件,所以Quichish没有其他选择,而是立即执行下一个命令(test.compare())。

但是,这可能导致在处理所有密钥事件之前从文本字段读取的文本值(例如,文本字段可能仅包含“My new art”当时)。反过来可能导致test.compare()失败,因为它期望文本域包含“My new article x”对于错误消息“本文已经存在!”要在标签对象中显示。

解决方案#1 - 暂停脚本以确保已处理事件

一个解决方案可以是捕捉()测试脚本以获得足够大的固定时间,以确保已处理关键事件:

import names

def main():
    startApplication("my_application")
    #...

    type(waitForObject(names.Article_Name_TextField), "My new article x")

    # Synchronize:
    # Is 0.5 seconds really long enough, even on our slow
    # nightly test machines?
    snooze(0.5)

    test.compare(waitForObject(names.Error_Label).text, "本文已经存在!")
test.py.

解决方案#2 - 首先等待所需的条件,然后继续

import names 

def main():
    startApplication("my_application")
    #...

    type(waitForObject(names.Article_Name_TextField), "My new article x")

    # Synchronize:
    for _ in range(5):
        if waitForObject(names.Error_Label).text == "My new article x":
            break
        snooze(1.0)
    else:
        test.fail("Sync failed for textfield after 5 seconds")

    test.compare(waitForObject(names.Error_Label).text, "本文已经存在!")
test.py.

另一个可能有问题的例子

Here is another example, this time with a TextField and a Button object (Add Article) for adding a “new article”:

import names 

def main():
    startApplication("my_application")
    #...

    type(waitForObject(names.Article_Name_TextField"), "My new 文章 x")
    clickButton(waitForObject(names.Add_Article"))
test.py.

Here the key event processing may still be going on in the application while Squish already clicks the Add Article button. So this could result in an article to be added with a “truncated” title.

对于此,可以应用相同的附加同步。可以应用于第一示例中的相同的同步。