发布新日志

  • 如何保存Sikuli执行结果

    2010-05-12 14:58:43

    目前在进行基于ANDROID手机平台的软件进行测试,原来以为没有可以自动化的工具,后来公司的CTO推荐了一款软件Sikuli(http://sikuli.org/index.shtml),这款软件可以借助ANDROID模拟器来完成自动化的测试.

    1. 具体的使用步骤请参见: http://sikuli.org/documentation.shtml
    2. 使用SIKULI的一些技巧请参见:引用自http://foolab.spaces.live.com/blog/cns!AF96E3E01D4605AA!222.entry

    一些特别注意事项

    1. 为了提高有效性 你应该尽量使用find进行处理
        在使用find时可以使用setAutoWaitTimeout进行超时设置,之后根据返回结果
        进行错误处理
    2. 在选取图像时应该尽量包含能够更容易区分其它相似区域的图像部分
       
    3. 为了进一步提高查找精确性可以先查找某个大的区域,在查找其子区域如:
        item = find(img).inside().find(img)
    4. 为了进行选择查找,可以使用图像集合操作 如:
        set=[img1,img2,…]
        for item in set:
         if find(item):
          break
    5. 可以使用jython支持的大部分库,记得在最前面添加导入,如使用操作xml
        from xml.dom import minidom
        xmldoc = minidom.parse(filename)
    6. 测试时为了中断后续操作记住使用 Ctrl + Shift + C
    7. 在使用Key 类成员时记得使用”+”连接,不要混淆KEY_ALT…等使用”,”分割
        不然将导致程序中断
    8. 在window下可以使用Sikuli-IDE.bat name.skl 命令行方式运行脚本
    9. 保存目录下存在很多不使用的png文件等所有设计完成可以使用另存其它文件名,这样将只保存有效的文件。
    10. 在window 下采用  type(Key.F4,KEY_ALT) 关键当前窗口是个不错的选择
    11. 你可以首先查找特定醒目项,之后根据信息构造新的Match对象,偏移一定距离定位新的位置 如:
       item = find(img)
       click(Match(item.getX(),item.getY(),10,20,1.0))

    3. 我们一直使用SIKULI IDE 来执行测试, 使用IDE执行测试的弊端是测试结果没有办法保存下来,下次执行就会把上次的执行结果覆盖掉, 如何将测试的结果保存下来呢?
    事前准备: SIKULI IDE安装好.
    (1)方案一:在测试脚本中加入print语句来导出except
    参见:https://answers.launchpad.net/sikuli/+question/107729

    In the IDE:
    you can use print to get some information:

    print find(img) # gives some info on the match object

    or more general
    m = find(img); print find.region # save match in m and print it using the last match saved in find.region

    you can say:

    print "checkpoint charly: ", m # prints a text and the match

    .... many possibilities, that can be extended, by all the things that can be done with python.

    When saving the script. as an .skl (executable) running it from commandline, your prints will go to sysout that can be piped to a file to save the run.


    (2)方案二:使用PYTHON的UNITTEST来运行测试,并将结果保存下来.
    参见:https://answers.launchpad.net/sikuli/+question/100436

    Running tests using Python's unittest

    The following method works on Mac and Windows.

    1) Write a real unit test using PyUnit.

    import sys
    import unittest
    setAutoWaitTimeout(5000)

    class MyTests(unittest.TestCase):
       def setUp(self):
          switchApp("/Applications/Safari.app")
          # @todo: do similar for IE on Windows

       def tearDown(self):
          pass

       def testNewTab(self):
          type("t", KEY_META)
          type("https://answers.launchpad.net/sikuli/+question/99979\n")
          m = find("sikuli-logo.png")
          assert(m is not None and m.getScore() > 0.9)

    suite = unittest.TestLoader().loadTestsFromTestCase(MyTests)
    unittest.TextTestRunner(verbosity=2).run(suite)

    2) Save your unit test as a Python script. in a folder with a matching name and .sikuli suffix (e.g., mytest.sikuli/mytest.py).

    3) Download the cross-platform, command line tool version of Sikuli from http://groups.csail.mit.edu/uid/sikuli/download.shtml.(目前这个地址没有下载command line tool的链接了,你可以从我的附件中下载)

    4) Extract the contents of the command line tool zip.

    On Windows:

    4) Download the Windows IDE version of Sikuli.

    5) Extract the Lib/ folder from the sikuli-ide-full.jar.

    6) Move the Lib/ folder into the same directory as the sikuli-script.jar from the command line tool version of Sikuli.

    7) Execute your test script. like so (assuming cygwin):

    export PATH=$PATH:./win32
    java -Dpython.path=Lib/ -jar sikuli-script.jar mytest.sikuli 2> test-output.log

    8) The test-output.log contains the results of the unit test run while stdout shows the sikuli logging info.

    On Mac:

    4) Download the Mac IDE version of Sikuli.

    5) Extract the Lib/ folder from the Sikuli.app/Contents/Resources/Java/sikuli-script.jar.

    6) Move the Lib/ folder into the same directory as the sikuli-script.jar from the command line tool version of Sikuli.

    7) Execute your test script. like so:

    java -d32 -Dpython.path=Lib/ -jar sikuli-script.jar mytest.sikuli 2> test-output.log

    8) The test-output.log contains the results of the unit test run while stdout shows the sikuli logging info.


     但上述的方法我始终没有运行成功,因为系统总是报以下错误:
    java.io.IOException: Unable to find library META-INF/lib/VDictProxy.dll on classpath
        at com.wapmx.nativeutils.jniloader.DefaultJniExtractor.extractResource(DefaultJniExtractor.java:95)
        at com.wapmx.nativeutils.jniloader.DefaultJniExtractor.extractJni(DefaultJniExtractor.java:81)
        at com.wapmx.nativeutils.jniloader.NativeLoader.loadLibrary(NativeLoader.java:43)
        at edu.mit.csail.uid.VDictProxy.<clinit>(VDictProxy.java:18)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at org.python.core.SyspathJavaLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at org.python.core.Py.findClassEx(Unknown Source)
        at org.python.core.SysPackageManager.findClass(Unknown Source)
        at org.python.core.PackageManager.findClass(Unknown Source)
        at org.python.core.SysPackageManager.findClass(Unknown Source)
        at org.python.core.PyJavaPackage.__findattr__(Unknown Source)
        at org.python.core.imp.importFromAs(Unknown Source)
        at org.python.core.imp.importFrom(Unknown Source)
        at python.edu.mit.csail.uid.Sikuli$py.f$0(D:\Testtools\sikuli\sikuli-script\sikuli-script.jar\Lib/python/edu/mit/csail/uid/Sikuli.py:11)
        at python.edu.mit.csail.uid.Sikuli$py.call_function(D:\Testtools\sikuli\sikuli-script\sikuli-script.jar\Lib/python/edu/mit/csail/uid/Sikuli.py)
        at org.python.core.PyTableCode.call(Unknown Source)
        at org.python.core.PyCode.call(Unknown Source)
        at org.python.core.imp.createFromCode(Unknown Source)
        at org.python.core.imp.createFromSource(Unknown Source)
        at org.python.core.ZipFileImporter$ZipFileLoader.load_module(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.python.core.PyReflectedFunction.__call__(Unknown Source)
        at org.python.core.PyMethod.__call__(Unknown Source)
        at org.python.core.PyObject.__call__(Unknown Source)
        at org.python.core.imp.loadFromLoader(Unknown Source)
        at org.python.core.imp.find_module(Unknown Source)
        at org.python.core.PyModule.impAttr(Unknown Source)
        at org.python.core.imp.import_next(Unknown Source)
        at org.python.core.imp.import_logic(Unknown Source)
        at org.python.core.imp.import_name(Unknown Source)
        at org.python.core.imp.importName(Unknown Source)
        at org.python.core.ImportFunction.load(Unknown Source)
        at org.python.core.ImportFunction.__call__(Unknown Source)
        at org.python.core.PyObject.__call__(Unknown Source)
        at org.python.core.__builtin__.__import__(Unknown Source)
        at org.python.core.imp.importAll(Unknown Source)
        at org.python.pycode._pyx0.f$0(<string>:1)
        at org.python.pycode._pyx0.call_function(<string>)
        at org.python.core.PyTableCode.call(Unknown Source)
        at org.python.core.PyCode.call(Unknown Source)
        at org.python.core.Py.runCode(Unknown Source)
        at org.python.core.Py.exec(Unknown Source)
        at org.python.util.PythonInterpreter.exec(Unknown Source)
        at edu.mit.csail.uid.ScriptRunner.runPython(ScriptRunner.java:29)
        at edu.mit.csail.uid.SikuliScript.main(SikuliScript.java:754)
    java.io.IOException: Unable to find library META-INF/lib/ScreenMatchProxy.dll on classpath
        at com.wapmx.nativeutils.jniloader.DefaultJniExtractor.extractResource(DefaultJniExtractor.java:95)
        at com.wapmx.nativeutils.jniloader.DefaultJniExtractor.extractJni(DefaultJniExtractor.java:81)
        at com.wapmx.nativeutils.jniloader.NativeLoader.loadLibrary(NativeLoader.java:43)
        at edu.mit.csail.uid.ScreenMatchProxy.<clinit>(ScreenMatchProxy.java:11)
        at edu.mit.csail.uid.SikuliScript.<init>(SikuliScript.java:105)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at org.python.core.PyReflectedConstructor.__call__(Unknown Source)
        at org.python.core.PyJavaInstance.__init__(Unknown Source)
        at org.python.core.PyJavaClass.__call__(Unknown Source)
        at org.python.core.PyObject.__call__(Unknown Source)
        at python.edu.mit.csail.uid.Sikuli$py.f$0(D:\Testtools\sikuli\sikuli-script\sikuli-script.jar\Lib/python/edu/mit/csail/uid/Sikuli.py:15)
        at python.edu.mit.csail.uid.Sikuli$py.call_function(D:\Testtools\sikuli\sikuli-script\sikuli-script.jar\Lib/python/edu/mit/csail/uid/Sikuli.py)
        at org.python.core.PyTableCode.call(Unknown Source)
        at org.python.core.PyCode.call(Unknown Source)
        at org.python.core.imp.createFromCode(Unknown Source)
        at org.python.core.imp.createFromSource(Unknown Source)
        at org.python.core.ZipFileImporter$ZipFileLoader.load_module(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.python.core.PyReflectedFunction.__call__(Unknown Source)
        at org.python.core.PyMethod.__call__(Unknown Source)
        at org.python.core.PyObject.__call__(Unknown Source)
        at org.python.core.imp.loadFromLoader(Unknown Source)
        at org.python.core.imp.find_module(Unknown Source)
        at org.python.core.PyModule.impAttr(Unknown Source)
        at org.python.core.imp.import_next(Unknown Source)
        at org.python.core.imp.import_logic(Unknown Source)
        at org.python.core.imp.import_name(Unknown Source)
        at org.python.core.imp.importName(Unknown Source)
        at org.python.core.ImportFunction.load(Unknown Source)
        at org.python.core.ImportFunction.__call__(Unknown Source)
        at org.python.core.PyObject.__call__(Unknown Source)
        at org.python.core.__builtin__.__import__(Unknown Source)
        at org.python.core.imp.importAll(Unknown Source)
        at org.python.pycode._pyx0.f$0(<string>:1)
        at org.python.pycode._pyx0.call_function(<string>)
        at org.python.core.PyTableCode.call(Unknown Source)
        at org.python.core.PyCode.call(Unknown Source)
        at org.python.core.Py.runCode(Unknown Source)
        at org.python.core.Py.exec(Unknown Source)
        at org.python.util.PythonInterpreter.exec(Unknown Source)
        at edu.mit.csail.uid.ScriptRunner.runPython(ScriptRunner.java:29)
        at edu.mit.csail.uid.SikuliScript.main(SikuliScript.java:754)
    java.io.IOException: Unable to find library META-INF/lib/Win32Util.dll on classpath
        at com.wapmx.nativeutils.jniloader.DefaultJniExtractor.extractResource(DefaultJniExtractor.java:95)
        at com.wapmx.nativeutils.jniloader.DefaultJniExtractor.extractJni(DefaultJniExtractor.java:81)
        at com.wapmx.nativeutils.jniloader.NativeLoader.loadLibrary(NativeLoader.java:43)
        at edu.mit.csail.uid.Win32Util.<clinit>(Win32Util.java:10)
        at edu.mit.csail.uid.SikuliScript.<init>(SikuliScript.java:111)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at org.python.core.PyReflectedConstructor.__call__(Unknown Source)
        at org.python.core.PyJavaInstance.__init__(Unknown Source)
        at org.python.core.PyJavaClass.__call__(Unknown Source)
        at org.python.core.PyObject.__call__(Unknown Source)
        at python.edu.mit.csail.uid.Sikuli$py.f$0(D:\Testtools\sikuli\sikuli-script\sikuli-script.jar\Lib/python/edu/mit/csail/uid/Sikuli.py:15)
        at python.edu.mit.csail.uid.Sikuli$py.call_function(D:\Testtools\sikuli\sikuli-script\sikuli-script.jar\Lib/python/edu/mit/csail/uid/Sikuli.py)
        at org.python.core.PyTableCode.call(Unknown Source)
        at org.python.core.PyCode.call(Unknown Source)
        at org.python.core.imp.createFromCode(Unknown Source)
        at org.python.core.imp.createFromSource(Unknown Source)
        at org.python.core.ZipFileImporter$ZipFileLoader.load_module(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.python.core.PyReflectedFunction.__call__(Unknown Source)
        at org.python.core.PyMethod.__call__(Unknown Source)
        at org.python.core.PyObject.__call__(Unknown Source)
        at org.python.core.imp.loadFromLoader(Unknown Source)
        at org.python.core.imp.find_module(Unknown Source)
        at org.python.core.PyModule.impAttr(Unknown Source)
        at org.python.core.imp.import_next(Unknown Source)
        at org.python.core.imp.import_logic(Unknown Source)
        at org.python.core.imp.import_name(Unknown Source)
        at org.python.core.imp.importName(Unknown Source)
        at org.python.core.ImportFunction.load(Unknown Source)
        at org.python.core.ImportFunction.__call__(Unknown Source)
        at org.python.core.PyObject.__call__(Unknown Source)
        at org.python.core.__builtin__.__import__(Unknown Source)
        at org.python.core.imp.importAll(Unknown Source)
        at org.python.pycode._pyx0.f$0(<string>:1)
        at org.python.pycode._pyx0.call_function(<string>)
        at org.python.core.PyTableCode.call(Unknown Source)
        at org.python.core.PyCode.call(Unknown Source)
        at org.python.core.Py.runCode(Unknown Source)
        at org.python.core.Py.exec(Unknown Source)
        at org.python.util.PythonInterpreter.exec(Unknown Source)
        at edu.mit.csail.uid.ScriptRunner.runPython(ScriptRunner.java:29)
        at edu.mit.csail.uid.SikuliScript.main(SikuliScript.java:754)
    test_01_emailVal (main.callspark736) ... ERROR
    test_02_emailVal2 (main.callspark736) ... ERROR
    test_03_emailVal3 (main.callspark736) ... ERROR
    test_04_emailVal4 (main.callspark736) ... ERROR
    test_05_passwordVal (main.callspark736) ... ERROR
    test_06_passwordVal2 (main.callspark736) ... ERROR
    test_07_loginSuc (main.callspark736) ... ERROR
    test_08_loginFail (main.callspark736) ... ERROR
    test_09_loginFail2 (main.callspark736) ... ERROR
    test_10_duplication (main.callspark736) ... ERROR
    test_11_location (main.callspark736) ... ERROR
    test_12_about (main.callspark736) ... ERROR
    test_13_back (main.callspark736) ... ERROR
    test_14_LoginSearch (main.callspark736) ... ERROR
    test_15_AnoSearch (main.callspark736) ... ERROR
    test_16_profileLinked (main.callspark736) ... ERROR
    test_17_profileEdit (main.callspark736) ... ERROR
    test_18_searchIcon (main.callspark736) ... ERROR
    test_19_errorMes1 (main.callspark736) ... ERROR

    ======================================================================
    ERROR: test_01_emailVal (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "e:\project\callspark\callspark736.sikuli\callspark736.py", line 19, in setUp
        wait("callicon.png")
      File "D:\Testtools\sikuli\sikuli-script\sikuli-script.jar\Lib/python/edu/mit/csail/uid/Sikuli.py", line 293, in wait
    java.lang.UnsatisfiedLinkError: java.lang.UnsatisfiedLinkError: edu.mit.csail.uid.ScreenMatchProxy.screenMatch(Ljava/lang/String;Ljava/lang/String;DI)[Ledu/mit/csail/uid/Match;

    ......
    ----------------------------------------------------------------------
    Ran 19 tests in 10.969s

    FAILED (errors=19)

     查了一下原因,是因为在COMMAND LINE TOOL中的sikuli-script.jar包/META-INF/lib文件夹中缺少了
    3个dll(
    VDictProxy.dll,Win32Util.dll,ScreenMatchProxy.dll)文件.
     尝试将
    sikuli-script.jar解压,然后将缺少的三个DLL文件拷贝到META-INF/lib文件夹中,然后重新生成sikuli-script.jar包, 然后再次按上述步骤来执行脚本,结果报找不到SIKULI-SCRIPT类错误.
     后续待研究..

    (3)方案三:使用command line命令来运行脚本.
    • 首先用SIKULI IDE 打开脚本,然后按以下格式进行调整

    import unittest
    setBundlePath("full path to your saved youNameIt.sikuli") # tells the Sikuli functions where to find the pictures(此处应特别注意,如果你不给出路径,在执行的过程中SIKULI会从临时文件夹中找图片,在执行过程中会报出无法LOAD图片的错误(can't lode file ***.png))
    class MyTests(unittest.TestCase):
       def setUp(self):
          switchApp("Safari")
          # on Windows: e.g. switchApp("google"), to switch to a running Chrome Browser

       def tearDown(self):
          pass

       def testNewTab(self):
          type("t", KEY_CMD) # Win: KEY_CTRL (KEY_META. gives Error)
          paste("https://answers.launchpad.net/sikuli/+question/100436") # this question ;-)
          type(Key.ENTER) # no errors with Key class in .skl
          m = find(<image>) # the captured Sikuli logo
          assert(m is not None and m.getScore() > 0.9)

    suite = unittest.

    TestLoader().loadTestsFromTestCase(MyTests)#注意MyTests需要替换成自己脚本的类名
    unittest.TextTestRunner(verbosity=2).run(suite)

    • 然后单击FILE-EXPORT Executable 命令导出.skl格式的文件.
    • 打开命令行窗口,并定位到SIKULI IDE的安装目录,然后执行以下命令来运行脚本和输出结果

    D:\Testtools\sikuli\sikuli-script> Sikuli-IDE.bat E:\MyTests.skl 2> E:\test-outlog.txt
    • 等整个测试执行完毕后,你可以从log文件中看到以下信息

    test_01_emailVal (main.callspark736) ... ERROR
    test_02_emailVal2 (main.callspark736) ... ERROR
    test_03_emailVal3 (main.callspark736) ... ERROR
    test_04_emailVal4 (main.callspark736) ... ERROR
    test_05_passwordVal (main.callspark736) ... ERROR
    test_06_passwordVal2 (main.callspark736) ... ERROR
    test_07_loginSuc (main.callspark736) ... ERROR
    test_08_loginFail (main.callspark736) ... ERROR
    test_09_loginFail2 (main.callspark736) ... ERROR
    test_10_duplication (main.callspark736) ... ERROR
    test_11_location (main.callspark736) ... ok
    test_12_about (main.callspark736) ... ERROR
    test_13_back (main.callspark736) ... ERROR
    test_14_LoginSearch (main.callspark736) ... ERROR
    test_15_AnoSearch (main.callspark736) ... ERROR
    test_16_profileLinked (main.callspark736) ... ERROR
    test_17_profileEdit (main.callspark736) ... ERROR
    test_18_searchIcon (main.callspark736) ... ERROR
    test_19_errorMes1 (main.callspark736) ... ERROR

    ======================================================================
    ERROR: test_01_emailVal (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 41, in test_01_emailVal
        assertExist(Pattern("email.png").similar(0.80))
    NameError: assertExist

    ======================================================================
    ERROR: test_02_emailVal2 (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 58, in test_02_emailVal2
        assertExist(Pattern("email.png").similar(0.80))
    NameError: assertExist

    ======================================================================
    ERROR: test_03_emailVal3 (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 77, in test_03_emailVal3
        assertExist(Pattern("email.png").similar(0.80))
    NameError: assertExist

    ======================================================================
    ERROR: test_04_emailVal4 (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 100, in test_04_emailVal4
        assertExist(Pattern("email.png").similar(0.80))
    NameError: assertExist

    ======================================================================
    ERROR: test_05_passwordVal (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 117, in test_05_passwordVal
        assertExist("passwordnotmatch.png")
    NameError: assertExist

    ======================================================================
    ERROR: test_06_passwordVal2 (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 134, in test_06_passwordVal2
        assertExist("passwordatleast6.png")
    NameError: assertExist

    ======================================================================
    ERROR: test_07_loginSuc (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 153, in test_07_loginSuc
        assertExist("logoutpal.png")
    NameError: assertExist

    ======================================================================
    ERROR: test_08_loginFail (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 162, in test_08_loginFail
        if find("emailnoword.png").inside().find("black.png"):
    AttributeError: 'NoneType' object has no attribute 'inside'

    ======================================================================
    ERROR: test_09_loginFail2 (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 182, in test_09_loginFail2
        if find("emailnoword.png").inside().find("black.png"):
    AttributeError: 'NoneType' object has no attribute 'inside'

    ======================================================================
    ERROR: test_10_duplication (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 210, in test_10_duplication
        assertExist("sameuser.png")
    NameError: assertExist

    ======================================================================
    ERROR: test_12_about (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 232, in test_12_about
        assertExist("aboutpal.png")
    NameError: assertExist

    ======================================================================
    ERROR: test_13_back (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 246, in test_13_back
        assertExist("searchtext.png")
    NameError: assertExist

    ======================================================================
    ERROR: test_14_LoginSearch (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 256, in test_14_LoginSearch
        if find("emailnoword.png").inside().find("black.png"):
    AttributeError: 'NoneType' object has no attribute 'inside'

    ======================================================================
    ERROR: test_15_AnoSearch (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 282, in test_15_AnoSearch
        assertExist("bing.png")
    NameError: assertExist

    ======================================================================
    ERROR: test_16_profileLinked (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 293, in test_16_profileLinked
        if find("emailnoword.png").inside().find("black.png"):
    AttributeError: 'NoneType' object has no attribute 'inside'

    ======================================================================
    ERROR: test_17_profileEdit (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 323, in test_17_profileEdit
        if find("emailnoword.png").inside().find("black.png"):
    AttributeError: 'NoneType' object has no attribute 'inside'

    ======================================================================
    ERROR: test_18_searchIcon (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 353, in test_18_searchIcon
        assertExist("searchtext.png")
    NameError: assertExist

    ======================================================================
    ERROR: test_19_errorMes1 (main.callspark736)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Program Files\Sikuli\sikuli-ide-full.jar\Lib/unittest.py", line 213, in __call__
      File "F:\temp\tmp-1723462100.sikuli\callspark737.sikuli\callspark737.py", line 363, in test_19_errorMes1
        assertExist("nosearcherr.png")
    NameError: assertExist

    ----------------------------------------------------------------------
    Ran 19 tests in 864.156s

    FAILED (errors=18)

Open Toolbar