Forum Discussion
I replaced the WaitAliasChild with FindChild and properties. It is much faster. Still kinda wonder why WaitAliasChild is taking so long. I want it to timeout when I want it to! I don't love the FindChild in this case since it mimimizes the effectiveness of reuse of a well constructed NameMapping. Ah well. Such is life.
Can you screenshot your NameMapping of the relevant section, making sure you expand to show the "Extended Find" column? Also, a bit more of your workflow/automation in a screenshot would be helpful. Obviously, there's a reason why you're waiting at that point... but I wonder if there might be something else that needs to be considered. If this is a web page, there could be other Active components and loads and things that are happening that calling WaitAliasChild at that point is causing other things to trigger.
This could also be a caching thing. Have you tried calling "RefreshNameMapping" on the parent object before you call WaitAliasChild?
- vthomeschoolmom5 years agoSuper Contributor
So this code that I have shown is on the OpenStandard procedure that is used in all the tests. Picture the desired workflow
- Open browser.
- Login.
- Do test stuff.
- Logout.
- Close browser.
Where bolded is the intent of StandardOpen()
If the test that preceeded the current one barfed for whatever reason, the browser is closed without logging out. So the next time login occurs, the page prompts do you want to resume the last session. The standard open then becomes
- Open browser.
- Login.
- If the login panel is present, you are seeing the session resumption prompt. Select to resume previous session.
- Logout ending session
- Login
Aliases.browser.pageMain.wndWindowContent.RefreshMappingInfo(); var sessionPresence = Aliases.browser.pageMain.wndWindowContent.WaitAliasChild("panLogin", ProjectSuite.Variables.TinyWaitTimeout); if (sessionPresence.Exists) { sessionPresencedialog = Aliases.browser.pageMain.wndWindowContent.panLogin.WaitAliasChild("selSession", ProjectSuite.Variables.TinyWaitTimeout); }
The WaitAliasChild here (re-added the code so it might not be precisely the same) is taking a loooooooong time to return the object with the exists stub only when the object does not exist. When it does, it returns right away. All is well.
var propNames = new Array("ObjectType", "ObjectIdentifier"); var propValues = new Array("Panel", "ng_login_container"); var sessionPresence = Aliases.browser.pageMain.wndWindowContent.FindChild(propNames, propValues, 10);
This works well. But, I happen to be in the middle of a big port to our app under test's new UI. One of the reasons it is going super well is that the NameMapping was pretty well organized. So I don't LOVE using Find. But this is not a hill I am going to die on. It really is just one function. That said, I sure would like to know what is going on for my greater understanding.
- vthomeschoolmom5 years agoSuper Contributor
More info.
function OpenStandard() { var userName = Project.Variables.UserName; var password = Project.Variables.Password; CloseBrowserWithConfirm(); Browsers.Item(ProjectSuite.Variables.BrowserUnderTest).Run(Project.Variables.Url); Aliases.browser.BrowserWindow(0).Maximize(); Login(userName, password); var propNames = new Array("ObjectType", "ObjectIdentifier"); var propValues = new Array("Panel", "ng_login_container"); var sessionPresence = Aliases.browser.pageMain.wndWindowContent.FindChild(propNames, propValues, 10); if (sessionPresence.Exists) { sessionPresencedialog = Aliases.browser.pageMain.wndWindowContent.panLogin.WaitAliasChild("selSession", ProjectSuite.Variables.TinyWaitTimeout); } if (sessionPresence.Exists) { Aliases.browser.pageMain.wndWindowContent.panLogin.btnContinue.Click(); aqUtils.Delay(ProjectSuite.Variables.TinyWaitTimeout); LogoutEndSession(); Login(userName, password); } }
- AlexKaras5 years agoChampion Level 3
Hi,
Thank you for the screenshot of your NameMapping/Aliasing.
Aliases is the means to provide you with more convenient and stable logical structure of your tested application's UI. Aliases are based on NameMapping which corresponds to the physical organization of application's UI. (Consider NameMapping as a translation table between physical and logical UI layouts.)
With the above in mind, my current understanding of your problem is this:
-- While aliased name of the sought for control is
Aliases.browser.pageMain.wndWindowContent.panLogin,
the physical layout (from NameMapping) is
Aliases.browser.pageMain.wndWindowContent.panel.panLogin;
-- It is my guess that if panLogin does not exist, its parent panel object does not exist as well;
-- If my guess is correct, then, when you ask TestComplete to wait for the panLogin aliased object, TestComplete internally first looks for the panel object. And if this object does not exist, then TestComplete waits for it using default project timeout.
I hope that this is the reason of the delay you are observing.
As a way to speed things up, you may try to add a panel object from NameMapping as another Aliased element and put it on the same level as panLogin one (in order to keep your existing code unchanged). For better usability you may rename the alias for this panel to, say, panLoginPanel.
Then, change your code line to this:
var sessionPresence = Aliases.browser.pageMain.wndWindowContent.WaitAliasChild("panLoginPanel", ProjectSuite.Variables.TinyWaitTimeout);
and keep the rest of your code as it is.
Does this help?
- vthomeschoolmom5 years agoSuper Contributor
What you say may be true. That the parent object does not exist. What is problematic for me is that if the parent does not exist, then clearly the child does not. What is the point of a timeout value if the seek is not going to ... well... timeout? The documented behavior is what I am seeking here. Look until time x. When time x is reached, stop.
Related Content
- 6 years agorizzomeister