ContributionsMost RecentMost LikesSolutionsRe: How do I change the path in all my tests? That would be great but whatever is easiest to switch back and forth is fine with me. Thanks for the response. How do I change the path in all my tests? We have two different environments and for those environments the endpoint *and* the path changes, e.g. http://env-qa.domain.com/path1/serviceName http://env-uat.domain.com/path2/serviceName I know how to use the Environments feature to change the Endpoint URL (e.g., http://env-qa.domain.com/) but how do I change the path (e.g. /path1/serviceName)? I looked through the Environments help, etc. but can't find anything that tells me how to do this. The help is ... sparse and much of it is out of date. Thanks! Re: Verifying multiple values in a single JSON response Thanks for the response. I should have mentioned that I tried this at some level. I have code that compares the top level nodes in the JSON response but some of the responses run very deep and it makes it hard to determine where exactly the actual failure is. I have actually seen this link but it doesn't mention jsonSlurper or deep compares, at least without additional libraries. Is there a particular library that you would recommend? I tried finding info on how to import a library into a groovy script and I didn't find any info... so I don't know if that means it can't be done or ??? Verifying multiple values in a single JSON response I'm new to SoapUI NG Pro and am trying to ramp up quickly to help on a current project. I see this as a common scenario and have googled and searched this forum but haven't found a good general purpose solution that I can reuse for my test cases. I did find this blog but it's 3 years old and seems overly complicated to do something this common. I'm assuming that I'm missing something simple with current functionality and am looking for a best practice to implement going forward. See the attached file for a sample JSON response. I send a request and get back a response like this with multiple "things", in this case products. How would I validate all X products in a single pass? I have tried the verify content assert at a high level and that works but if one property on one product is off, the whole thing fails and I have to look through a large respose to figure out exactly what is different. I would prefer to put content verification at a more granular level but that becomes tedious if I'm expecting a large number of things to check. In the simple attached example, there are 8 products each with 5 properties to check so that's 40 validations that I would have to manually create. Is there a way to do multi-select and bulk create asserts like this? I didn't see anything. The other route I am exploring isdata source looping but I'm not sure how to validate all40 properties in a single pass using looping. I don't want to resend the request each time when it's not necessary. Another route would be scripting. It seems that it would involve parsing a large section of the datasource (maybe Excel?) and then looping through the JSON response and comparing. That seems overly involved but I'm open to that if that's what is easiest/best in this case. Any suggestions, pointers to articles, etc. would be much appreciated. Re: Bulk delete old users?Thanks, Will, for the response. I could manually delete 711 users one at a time... but I think it might be faster to wait a year until the bulk delete feature is implemented... ;) Yes... thanks... I am aware that these deletes are soft deletes. I think that's all I'm looking for at this point. I guess I could hard delete those users that have never logged in because they shouldn't have any associated records with their account. Then I could just soft delete those users that have left the company or haven't used ALM in ~year to keep their associated records. I may need to psych myself up to tackle this task... Ooooh... maybe I'll write a test complete script that will delete the users for me... that's a possible workaround. I was really hoping there would be a web service function to delete a user or something like that. The optimal solution would be what you suggested... to have something in the UI to bulk delete at least a page of users at a time. Thanks again.Bulk delete old users?I was looking through the Users list in ALMComplete and found that we have a large number of accounts that have never been used (711 of 976). I'm guessing that they were created when ALMComplete was rolled out 3 years ago but then just never used. I would like to clean up those users. What is the recommended way to do this clean up? I'm assuming delete each user but I don't want to delete them one at a time and I don't see a way to do this in bulk through the UI. I explored the WebServices route but don't see a way to delete users there either. I'm looking for recommendations for both: 1. Bulk deleting Users from Security/Users 2. Bulk deleting Users from Users on this Project Any suggestions? Thanks.SolvedRe: Page Object Pattern with TestComplete. I've been wanting to post an example of this for a while... I just haven't taken the time to do it so I'm glad you asked. It compelled me to get it done finally. I've been using the page object method in TestComplete for almost a year now and it's been great. When I started this, I was new to TestComplete and new to JS so it was a learning process for me on two fronts. It went through several iterations, improvements and I think what I have now is somewhat mature... BUT... I hope to have people tear it up, give me suggestions to make it better, etc. I hope others will post examples of how they use page objects also. Here's a pretty simple example of a couple page objects that I created based on the SmartBear site and a Main script that uses those page objects and does some simple validations. It's all done in JScript. Each of these pages is a separate script file... Home, BrowseablePages, and HomePage. Main //USEUNIT BrowseablePages //USEUNIT HomePage function Main() { // instantiate the BrowseablePages page object to get the home page URL var browseablePages = BrowseablePages.Init(); var url = browseablePages.Home; // set up browser variables and navigate to the home page var browserFamily = btChrome; var browserName = "chrome" var browser = Browsers.Item(browserFamily); browser.Run(url); Log.Event("Home page"); // load the home page page object var homePage = HomePage.Init(browserName); // validate that the logo on the home page exists if (homePage.Logo.naturalWidth === 0) { // image is missing Log.Error("Logo on home page is not displayed"); } else { Log.Checkpoint("Logo on home page is displayed"); } // write the event names to the log var events = homePage.GetEvents(browserName); for (var i = 0; i < events.length; i++) { Log.Message("Event " + i + ": " + events); } } BrowseablePages function Init() { var browseablePages = {}; var domain = "http://smartbear.com/"; browseablePages.Domain = domain; browseablePages.Home = domain; // in this case the home page and domain are the same browseablePages.Forums = domain + "/forums/"; browseablePages.TestComplete = domain + "/products/qa-tools/automated-testing-tools/"; return browseablePages; } Home page function Init(browserName) { var page = Sys.Browser(browserName).Page("*"); page.Wait(); // add code to confirm that you are on the correct page // create your page object so that you can add properties and methods to it var homePage = {}; // add some properties // I use DOM methods of retreiving elements because I find that they are much faster. If you need or want to // get elements using the TestComplete methods, you can easily substitute them here homePage.Logo = page.contentDocument.querySelectorAll("div.logo-img")[0].getElementsByTagName("img")[0]; homePage.SearchBox = page.contentDocument.querySelectorAll("input.form-control-search")[0]; homePage.SearchButton = page.contentDocument.querySelectorAll("span.button-searchbutton")[0]; // add a method (function) to retreive the events list from the SmartBear home page homePage.GetEvents = function (browserName) { var page = Sys.Browser(browserName).Page("*"); page.Wait(); // get the parent element for the events list var events = page.contentDocument.querySelectorAll("div.feed-item")[2].querySelectorAll("a.feed-item-link"); // create an array that will contain the event titles var eventTitles = []; for (var i = 0; i < events.length; i++) { // push adds an element to the array eventTitles.push(events.innerText); } return eventTitles; } return homePage; } Re: How to extract messages created by the user from the logs?Read the page on the Log.Message Method: http://support.smartbear.com/viewarticle/56293/. There is an optional Picture parameter which is the picture I'm assuming you are referring to? If you look at the Picture Object pagethere are examples of how to write those pictures to file. I'm thinking you might be referring to one of the other Log methods... Log.Error, etc. that writes a picture to the log by default.Re: JScript vs Vbscript for web applicationsI would suggest JScript also because it is so similar to javaScript and there are TONS of resources for javaScript. Some references you may have already or will likely want to bookmark... 1. Mozilla Developer Network (MDN) is a great reference for quick look ups/reference material and also guides.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide 2. If you are trying to write something and get stuck or have questions, obviously you can google for answers. I find a lot (most?) of my better answers on Stack Overflow. http://stackoverflow.com/ 3. After you get some code written, send it through JSHint to find the typos and low hanging fruit.http://www.jshint.com/ 4. Once the code is "well written", then you send it through JSBeautifier to make it easier to read. There are some customizable settings to suit most preferences. http://jsbeautifier.org/Re: How to extract messages created by the user from the logs?Have you considered creating a wrapper function that writes a string to a text file along with writing to the log? That way you don't have to write a tool to extract certain messages. I use something like the (untested) code below to dump a CSV-like file that I import into Excel. My scenario is that I'm testing ~800 products and doing 40k+ validations. Searching through the logs is too time consuming so I export a text file, load it into Excel, and then I can filter down to only the failures, etc. for easier investigation and bug entry. I just attach the resulting Excel sheet with all the failures. function LogMessage(msg) { WriteMessage(msg); Log.Message(msg); } function WriteMessage(msg) { // simple example to give you an idea of how writing to a text file would work from an automation script var filePath = "c:\log.txt"; // look up documentation on WriteToTextFile() for more details aqFile.WriteToTextFile(filePath, msg, aqFile.ctANSI, true); }