<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8326000613616636989</id><updated>2011-07-07T18:03:13.350-07:00</updated><category term='strongwind'/><category term='test'/><category term='novell'/><category term='mono'/><category term='Microsoft.JScript.dll'/><category term='A11y'/><title type='text'>Calen in Novell</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://calen-innovell.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326000613616636989/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://calen-innovell.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Calen Chen</name><uri>http://www.blogger.com/profile/15374239494802983297</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp3.blogger.com/_PdhuC9c1tu0/R_MeT0a7yGI/AAAAAAAAAAc/vI9M7pZOcF4/S220/Untitled.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8326000613616636989.post-6317452536847238549</id><published>2008-11-18T22:46:00.000-08:00</published><updated>2008-11-18T23:07:12.176-08:00</updated><title type='text'>Build A11y</title><content type='html'>1.creat evn:&lt;br /&gt;#!/bin/bash&lt;br /&gt;MONO_PREFIX=/opt/mono&lt;br /&gt;GNOME_PREFIX=/usr&lt;br /&gt;export DYLD_LIBRARY_PATH=$MONO_PREFIX/lib:$DYLD_LIBRARY_PATH&lt;br /&gt;export LD_LIBRARY_PATH=$MONO_PREFIX/lib:$LD_LIBRARY_PATH&lt;br /&gt;export C_INCLUDE_PATH=$MONO_PREFIX/include:$GNOME_PREFIX/include&lt;br /&gt;export ACLOCAL_PATH=$MONO_PREFIX/share/aclocal&lt;br /&gt;export PKG_CONFIG_PATH=$MONO_PREFIX/lib/pkgconfig:$GNOME_PREFIX/lib/pkgconfig&lt;br /&gt;PATH=$MONO_PREFIX/bin:$PATH&lt;br /&gt;PS1="[mono]\w@ "&lt;br /&gt;&lt;br /&gt;2.download libgdiplus, mono, gtk-sharp, monodoc, mono-tools, uia2atk from SVN&lt;br /&gt;&lt;br /&gt;3.run #source ./evn&lt;br /&gt;&lt;br /&gt;4.build and install sources with ./autogen --prefix=/opt/mono &amp;&amp; make &amp;&amp; make install, the order is libgdiplus-&gt;mono-&gt;gtk-sharp-&gt;monodoc-&gt;mono-tools-&gt;uia2atk(UIAutomation-&gt;UIAutomationWinforms-&gt;UiaAtkBridge)&lt;br /&gt;&lt;br /&gt;5.modify /usr/bin/ipy from "/usr/bin/mono" to "/opt/mono/bin/mono /"&lt;br /&gt;&lt;br /&gt;Okay, now you can run SWF application from uia2atk/test/samples, and your accerciser can catch the ipy application. you have two mono environment running in parallel&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326000613616636989-6317452536847238549?l=calen-innovell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://calen-innovell.blogspot.com/feeds/6317452536847238549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326000613616636989&amp;postID=6317452536847238549' title='39 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326000613616636989/posts/default/6317452536847238549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326000613616636989/posts/default/6317452536847238549'/><link rel='alternate' type='text/html' href='http://calen-innovell.blogspot.com/2008/11/build-a11y.html' title='Build A11y'/><author><name>Calen Chen</name><uri>http://www.blogger.com/profile/15374239494802983297</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp3.blogger.com/_PdhuC9c1tu0/R_MeT0a7yGI/AAAAAAAAAAc/vI9M7pZOcF4/S220/Untitled.png'/></author><thr:total>39</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326000613616636989.post-5973994209669789094</id><published>2008-07-06T21:59:00.000-07:00</published><updated>2008-08-12T04:23:12.775-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strongwind'/><category scheme='http://www.blogger.com/atom/ns#' term='A11y'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><title type='text'>strongwind study info</title><content type='html'>here is my study information about using strongwind test against winforms. also i hope someone can give me idea to handle the problems below here.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to def an action that strongwind never support?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example give “press “ action to one button:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def press(self,button): &lt;br /&gt;        procedurelogger.action('Press the %s.' % button) &lt;br /&gt;        button._doAction('press')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to check the status when send one action?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example check the “armed” status when send press action:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def assertResult(self, button, result):   &lt;br /&gt;        procedurelogger.expectedResult('%s is %s.' % (button, result)) &lt;br /&gt;        def resultMatches(): &lt;br /&gt;            if result == "armed": &lt;br /&gt;                return button.armed &lt;br /&gt;            elif result == "unarmed": &lt;br /&gt;                return not button.armed &lt;br /&gt;            else: &lt;br /&gt;                raise InvalidState, "%s has no such state:  %s" %\ &lt;br /&gt;                                 (button, result) &lt;br /&gt;        assert retryUntilTrue(resultMatches)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to close an extra windows?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example to close a Dialog:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def clickResult(self): &lt;br /&gt;        self = self.app.findDialog(None,"Message Dialog") &lt;br /&gt;        self.altF4() &lt;br /&gt;        #if the dialog have 'ok' 'cancel' etc. Button in here can set like: &lt;br /&gt;        self.ok()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For example to close an Alert if there isn't close button on it. Strongwind does not support altF4 to Alert so we should set the action and expected by ourselves:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def clickResult(self): &lt;br /&gt;        self = self.app.findAlert(None,"Message Dialog") &lt;br /&gt;        procedurelogger.action('Press altF4 to close %s' % self)&lt;br /&gt;        self.keyCombo('&lt;Alt&gt;F4')&lt;br /&gt;            &lt;br /&gt;        procedurelogger.expectedResult('%s has been closed' % self)&lt;br /&gt;        def resultMatches(): &lt;br /&gt;            return not self &lt;br /&gt;        assert retryUntilTrue(resultMatches)&lt;br /&gt;&lt;br /&gt;    #if there is close button on Alert windows can set like:&lt;br /&gt;    def clickResult(self): &lt;br /&gt;        self = self.app.findAlert(None,"Message Dialog") .ok()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;            &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to close appliction's windows?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;strongwind support altF4() can send action and return expected, so we use it like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def quit(self): &lt;br /&gt;        self.altF4()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;if the application include 'quit' button we can do like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def quit(self):&lt;br /&gt;        self.findPushButton('quit').click()&lt;br /&gt;        self.assertClosed()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to insert some text into a Text Filed?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Strongwind support 'typeText(text)' in class Accessible or 'enterText(text)' in class Text so we can use it to input text'aaaa':&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    self.app.findText(None).typeText(“aaaa”)&lt;br /&gt;    #we also can set like:&lt;br /&gt;    self.app.findText(None).enterText(“aaaa”)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to insert password text into a Text Filed?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Stringwind support 'class PasswordText' that function is the same as 'class Text', so we also can use 'typeText(text)' or 'enterText(text)'.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to check if the item list( or menuitem list) appear?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example to check the combobox menuitem list:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    #first set 'self.combobox = self.findComboBox(None)' in __init__&lt;br /&gt;    def press(self,button): &lt;br /&gt;        procedurelogger.action('Press the \"%s\".' % button) &lt;br /&gt;        button._doAction('press') &lt;br /&gt;        sleep(config.SHORT_DELAY) &lt;br /&gt;&lt;br /&gt;        procedurelogger.expectedResult('list combobox menu item list appear')          &lt;br /&gt;        def resultMatches(): &lt;br /&gt;            return self.combobox.findMenuItem(None) &lt;br /&gt;        assert retryUntilTrue(resultMatches)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(if menuitem list not appear the test will return fail when do press action.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to select item if the item in list is changed instability?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example the menuitem list in StarDict is changed instability so first we should use '__getattr__' get one item's name then send an action to it:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def selectitem(self,result=None): &lt;br /&gt;        #just can get the first item's logname&lt;br /&gt;        #self.combobox = self.findComboBox(None)&lt;br /&gt;        result = self.combobox.findMenuItem(None).__getattr__('logName') &lt;br /&gt;        #strongwind support 'select(self, name, logName=None, log=True)'&lt;br /&gt;        self.combobox.select(result) &lt;br /&gt;        sleep(config.SHORT_DELAY) &lt;br /&gt;&lt;br /&gt;        #check if the text in text filed is same as the select text &lt;br /&gt;        procedurelogger.expectedResult('the text change to %s' % result) &lt;br /&gt;        def resultMatches(): &lt;br /&gt;            return self.combobox.findText(None).text == result &lt;br /&gt;        assert retryUntilTrue(resultMatches)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to test MenuBar and MenuItem?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Strongwind supports '_open, select, open' function default. 'select' can send click action to what you want menuitem. '_open, open' just send click action to menu to list the item but not click menuitem.&lt;br /&gt;&lt;br /&gt;For example there are 'New' 'Open' MenuItem in 'File' MenuBar in Gedit application:&lt;br /&gt;1:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    #check if the menuitem in menubar can be clicked&lt;br /&gt;    #first set 'self.menubar = self.findMenuBar('')' in __init__&lt;br /&gt;    def menuSelect(self, menuname, itemname):&lt;br /&gt;        #self.menubar.open([menuname]) and self.findMenuItem(itemname).click()&lt;br /&gt;        #is the same action as below, but not log for the click action&lt;br /&gt;        self.menubar.select([menuname, itemname])&lt;br /&gt;&lt;br /&gt;        if itemname == 'New':&lt;br /&gt;            def resultMatches():&lt;br /&gt;                procedurelogger.expectedResult('Unsaved Document 1 appears')&lt;br /&gt;                return self.findPageTab('Unsaved Document 1')&lt;br /&gt;            assert retryUntilTrue(resultMatches)&lt;br /&gt;&lt;br /&gt;        if itemname == 'Open...':&lt;br /&gt;            self.app.findDialog(None,logName='Open Files').cancel()&lt;br /&gt;     &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    # check if the menu can be clicked and if the menuitem list can be showed&lt;br /&gt;    def menuResult(self, menuname, itemname):&lt;br /&gt;        procedurelogger.action('click %s menu' % menuname)&lt;br /&gt;        self.findMenu(menuname).click()&lt;br /&gt;&lt;br /&gt;        procedurelogger.expectedResult('%s menu status is selected and found %s item in %s' % (menuname, itemname, menuname))&lt;br /&gt;        def resultMatches():&lt;br /&gt;            return self.findMenuItem(itemname) and self.findMenu(menuname).selected&lt;br /&gt;&lt;br /&gt;        assert retryUntilTrue(resultMatches)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to test StatusBar?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example in StatusBar there is a Label to show the numbers of line&amp;character when we  enter text in TextBox(see gedit). What we need to do is first find the TextBox to enter some character by enterText(text), then check if we can find the StatusBar with the Label's Text(cont the numbers of line&amp;character): &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def statusbarResult(self):&lt;br /&gt;        self.findPageTab('Unsaved Document 1').findText(None).enterText('enter some character')&lt;br /&gt;&lt;br /&gt;        procedurelogger.expectedResult('Label text in statusbar is \"  Ln 1, Col 21\"')&lt;br /&gt;        def resultMatches():&lt;br /&gt;            return self.findStatusBar('  Ln 1, Col 21').text&lt;br /&gt;        assert retryUntilTrue(resultMatches)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to test ToolBar?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example in gedit ToolBar there is a 'New' pushbutton, we can click New button then to check if rise a new textbox pagetab:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def toolbarResult(self, buttonName):&lt;br /&gt;        self.findToolBar(None).findPushButton(buttonName).click()&lt;br /&gt;&lt;br /&gt;        procedurelogger.expectedResult('Unsaved Document 3 appears')&lt;br /&gt;        def resultMatches():&lt;br /&gt;            return self.findPageTab('Unsaved Document 3')&lt;br /&gt;&lt;br /&gt;        assert retryUntilTrue(resultMatches)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to test PageTab(or TabPage)?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Strongwind support 'findPageTab(Name)' to PageTabList, and 'select()' to do PageTab action, and 'assertSelected()' to check the select result.&lt;br /&gt;&lt;br /&gt;For example in gedit when we click 'New' button it will rise some new PageTab:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    #use 'select()' to change the tabpage, use 'assertSelected()' to check the selected or by checking the Label's change in statusbar&lt;br /&gt;    def pagetabResult(self, pagetabName):&lt;br /&gt;        pagetab = self.findPageTab(pagetabName)&lt;br /&gt;        pagetab.select()&lt;br /&gt;        if pagetabName == '*Unsaved Document 1':&lt;br /&gt;            procedurelogger.expectedResult('change TabPage to \"*Unsaved Document 1\"')&lt;br /&gt;            def resultMatches():&lt;br /&gt;                return self.findStatusBar('  Ln 1, Col 21').text&lt;br /&gt;            assert retryUntilTrue(resultMatches)&lt;br /&gt;        else:&lt;br /&gt;            pagetab.assertSelected()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to test ScrollBar?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example in gedit there is a scrollbar the Value is 0-169, we can set newValue as '0' '30' '169' '-10' '200' to test if it can be set.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def scrollbarResult(self,newValue=None):&lt;br /&gt;        #if we didn't know maximumValue previously, we can get it like:&lt;br /&gt;        maximumValue = self.findScrollBar(None)._accessible.queryValue().maximumValue&lt;br /&gt;&lt;br /&gt;        procedurelogger.action('set scrollbar value to \"%s\"' % newValue)&lt;br /&gt;        self.findScrollBar(None).&lt;span style="font-weight:bold;"&gt;__setattr__&lt;/span&gt;('value',newValue) &lt;br /&gt;&lt;br /&gt;        def resultMatches():&lt;br /&gt;            if 0 &lt;= newValue &lt;= maximumValue:&lt;br /&gt;                procedurelogger.expectedResult('the current value of scrollbar is \"%s\"' % newValue)&lt;br /&gt;                return self.findScrollBar(None).&lt;span style="font-weight:bold;"&gt;__getattr__&lt;/span&gt;('value') == newValue&lt;br /&gt;            else:&lt;br /&gt;                procedurelogger.expectedResult('value \"%s\" out of run ' % newValue)&lt;br /&gt;                return not self.findScrollBar(None).__getattr__('value') == newValue&lt;br /&gt;        assert retryUntilTrue(resultMatches)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to click buttons those without name?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example there are three radiobutton without name(see stardict application), we can use 'findAllRadioButtons(None)' to show all radiobutton, then send click action to one of them:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def radiobuttonResult(self,buttonnum):&lt;br /&gt;        rblist = self.findAllRadioButtons("")&lt;br /&gt;        #it will rise action log default&lt;br /&gt;        rblist[buttonnum].click()&lt;br /&gt;&lt;br /&gt;        procedurelogger.expectedResult('you have clicked radiobutton \"%s\"' % buttonnum)&lt;br /&gt;&lt;br /&gt;        def resultMatches():&lt;br /&gt;            if buttonnum == 1:&lt;br /&gt;                return self.findTableCell("Links")&lt;br /&gt;            elif buttonnum == 2:&lt;br /&gt;                return self.findPushButton("Translate")&lt;br /&gt;        assert retryUntilTrue(resultMatches)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;thanks bgmerrell ^ ^&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to test suspend menu list?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example when click one button it rise a suspend menu and have one menuitem name 'About' in menu (sometimes it has CheckMenuItem in menu list):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def suspendResult(self):&lt;br /&gt;&lt;br /&gt;        self.findPushButton("home").click()&lt;br /&gt;&lt;br /&gt;        procedurelogger.action('click \"About\" in menuitem list')&lt;br /&gt;&lt;br /&gt;        self.app.findWindow(None).findMenuItem("About").click()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        self.app.findDialog("About stardict").close()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to move the mouse and How to test ToolTips?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example there are some button have tooltip, now we should use 'generateMouseEvent'  move the mouse to the button and halt one second, than search for tooltip's label:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    #tooltip&lt;br /&gt;    def mousePoint(self,buttonnum, tooltipLabel, xOffset=0, yOffset=0):&lt;br /&gt;&lt;br /&gt;        procedurelogger.action('move mouse to radiobutton \"%s\"' % buttonnum)&lt;br /&gt;&lt;br /&gt;        bbox = self.findAllRadioButtons(None)[buttonnum].extents&lt;br /&gt;&lt;br /&gt;        x = bbox.x + (bbox.width / 2) + xOffset&lt;br /&gt;&lt;br /&gt;        y = bbox.y + (bbox.height / 2) + xOffset&lt;br /&gt;&lt;br /&gt;        pyatspi.Registry.generateMouseEvent(x, y, 'abs')&lt;br /&gt;&lt;br /&gt;        sleep(config.MEDIUM_DELAY)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        procedurelogger.expectedResult('found tooltip, the label is \"%s\"' % tooltipLabel)&lt;br /&gt;&lt;br /&gt;        def resultMatches():&lt;br /&gt;&lt;br /&gt;            return self.app.findLabel("%s" % tooltipLabel)&lt;br /&gt;&lt;br /&gt;        assert retryUntilTrue(resultMatches)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to sort the TableCells?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example to check if all of the TableCell items have been sorted after click TableColumnHeader in TreeView test:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    #define the tuple of table cell names&lt;br /&gt;    ASCENDING = ('parent 0', 'parent 1', 'child 0 of parent 0')&lt;br /&gt;    DESCENDING = ('parent 1', 'parent 0', 'child 0 of parent 1')&lt;br /&gt;&lt;br /&gt;    #click TableColumnHeader&lt;br /&gt;    def tchClick(self, accessible):&lt;br /&gt;        procedurelogger.action('click %s.' % accessible)&lt;br /&gt;        accessible.click()&lt;br /&gt;&lt;br /&gt;    #assert that the sorting of the TreeView is ascending&lt;br /&gt;    def assertAscending(self):&lt;br /&gt;        procedurelogger.expectedResult('TreeView sorting is ascending')&lt;br /&gt;        self.table_cells = self.findAllTableCells(None)&lt;br /&gt;        tcs = [table_cell.name for table_cell in self.table_cells]&lt;br /&gt;        def resultMatches():&lt;br /&gt;            return tuple(tcs) == self.ASCENDING&lt;br /&gt;        assert retryUntilTrue(resultMatches)&lt;br /&gt;&lt;br /&gt;    #assert that the soring of the TreeView is descending&lt;br /&gt;    def assertDescending(self):&lt;br /&gt;        procedurelogger.expectedResult('TreeView sorting is decending')&lt;br /&gt;        self.table_cells = self.findAllTableCells(None)&lt;br /&gt;        tcs = [table_cell.name for table_cell in self.table_cells]&lt;br /&gt;        def resultMatches():&lt;br /&gt;            return tuple(tcs) == self.DESCENDING&lt;br /&gt;        assert retryUntilTrue(resultMatches)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;problems:&lt;br /&gt;&lt;br /&gt;1.Accerciser in openSUSE 11.0 can't show tooltip detail, but in openSUSE 10.3 works well. 'gail' cause the problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326000613616636989-5973994209669789094?l=calen-innovell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://calen-innovell.blogspot.com/feeds/5973994209669789094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326000613616636989&amp;postID=5973994209669789094' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326000613616636989/posts/default/5973994209669789094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326000613616636989/posts/default/5973994209669789094'/><link rel='alternate' type='text/html' href='http://calen-innovell.blogspot.com/2008/07/strongwind-study-info.html' title='strongwind study info'/><author><name>Calen Chen</name><uri>http://www.blogger.com/profile/15374239494802983297</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp3.blogger.com/_PdhuC9c1tu0/R_MeT0a7yGI/AAAAAAAAAAc/vI9M7pZOcF4/S220/Untitled.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326000613616636989.post-7020041364005836187</id><published>2008-04-06T19:02:00.000-07:00</published><updated>2008-04-06T19:42:28.705-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='novell'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft.JScript.dll'/><title type='text'>cannot find metadata file Microsoft.JScript.dll</title><content type='html'>If you got "error CS0006: cannot find metadata file `Microsoft.JScript.dll'" When you run Winforms example(hello.cs) by 'mcs -pkg:dotnet' in openSUSE OS. you need download `Microsoft.JScript.dll' first, and put it with hello.cs together.&lt;br /&gt;&lt;br /&gt;It can be download from:&lt;br /&gt;&lt;a href="http://www.dlldump.com/download-dll-files_new.php/dllfiles/M/Microsoft.JScript.dll/7.0.9951.0/download.html"&gt;download website&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326000613616636989-7020041364005836187?l=calen-innovell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://calen-innovell.blogspot.com/feeds/7020041364005836187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326000613616636989&amp;postID=7020041364005836187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326000613616636989/posts/default/7020041364005836187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326000613616636989/posts/default/7020041364005836187'/><link rel='alternate' type='text/html' href='http://calen-innovell.blogspot.com/2008/04/my-first-time-to-run-winforms-example.html' title='cannot find metadata file Microsoft.JScript.dll'/><author><name>Calen Chen</name><uri>http://www.blogger.com/profile/15374239494802983297</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp3.blogger.com/_PdhuC9c1tu0/R_MeT0a7yGI/AAAAAAAAAAc/vI9M7pZOcF4/S220/Untitled.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326000613616636989.post-3027018647655222681</id><published>2008-04-01T22:38:00.000-07:00</published><updated>2008-04-08T03:00:55.522-07:00</updated><title type='text'>Install Accerciser</title><content type='html'>When I run my accerciser program, It return me some errors like "no gtksourceview module" "IPython module error".  Here, I write down my install step to resolve those problems:&lt;br /&gt;	&lt;meta equiv="CONTENT-TYPE" content="text/html; charset=utf-8"&gt;&lt;title&gt;&lt;/title&gt;&lt;meta name="GENERATOR" content="OpenOffice.org 2.3  (Linux)"&gt; 	 	 	&lt;style type="text/css"&gt; 	&lt;!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--&gt; 	&lt;/style&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;install gtksourceview-1.8.5&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;		yast -i gtksourceview18&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;yast -i gtksourceview18-devel&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;	install Ipython&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;		yast -i IPython&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;		&lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;	install pygtksourceview&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;download form &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=112429&amp;amp;package_id=121748&amp;amp;release_id=272585"&gt;http://sourceforge.net/project/showfiles.php?group_id=112429&amp;amp;package_id=121748&amp;amp;release_id=272585&lt;/a&gt;&lt;/span&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;		./configure&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;		./make&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;		./make install&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;	(accerciser will return you “no gtksourceview module” if without this package)&lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;	install accerciser&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;download from &lt;a href="http://live.gnome.org/Accerciser"&gt;http://live.gnome.org/Accerciser&lt;/a&gt;&lt;/span&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;		./configure –prefix /usr&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;		./make&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;		./make install&lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;run accerciser&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Thorndale AMT,serif;"&gt;		./usr/bin/accerciser&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326000613616636989-3027018647655222681?l=calen-innovell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://calen-innovell.blogspot.com/feeds/3027018647655222681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326000613616636989&amp;postID=3027018647655222681' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326000613616636989/posts/default/3027018647655222681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326000613616636989/posts/default/3027018647655222681'/><link rel='alternate' type='text/html' href='http://calen-innovell.blogspot.com/2008/04/install-accerciser.html' title='Install Accerciser'/><author><name>Calen Chen</name><uri>http://www.blogger.com/profile/15374239494802983297</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp3.blogger.com/_PdhuC9c1tu0/R_MeT0a7yGI/AAAAAAAAAAc/vI9M7pZOcF4/S220/Untitled.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326000613616636989.post-6239557380245538664</id><published>2008-03-25T04:18:00.000-07:00</published><updated>2008-11-18T23:09:22.044-08:00</updated><title type='text'>my first work day in Novell</title><content type='html'>Today is my first day on duty at Novell, I fell so happy and excited! It start my new life, just like open a new chapter in my life and like open a new chapter in my job! I will try my best to take this job! come on Calen!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326000613616636989-6239557380245538664?l=calen-innovell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://calen-innovell.blogspot.com/feeds/6239557380245538664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326000613616636989&amp;postID=6239557380245538664' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326000613616636989/posts/default/6239557380245538664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326000613616636989/posts/default/6239557380245538664'/><link rel='alternate' type='text/html' href='http://calen-innovell.blogspot.com/2008/03/my-first-work-day-at-novell.html' title='my first work day in Novell'/><author><name>Calen Chen</name><uri>http://www.blogger.com/profile/15374239494802983297</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp3.blogger.com/_PdhuC9c1tu0/R_MeT0a7yGI/AAAAAAAAAAc/vI9M7pZOcF4/S220/Untitled.png'/></author><thr:total>2</thr:total></entry></feed>
