Coded UI error: The following element is not longer availabe

后端 未结 7 852
清歌不尽
清歌不尽 2021-01-14 15:44

I recorded some test cases with CUIT in VS2010. Everything worked fine the day before. So, today I run again, all the test failed, with the warning: The following element is

7条回答
  •  醉梦人生
    2021-01-14 16:27

    There may be a field in the SearchProperties (or possible the FilterProperties) that has a value set by the web site, or that represents some kind of window ID on your desktop. Another possibility is that the web page title changes from day to day or visit to visit. Different executions of the browser or different visits to the web page(s) create different values. Removing these values from the SearchProperties (or FilterProperties) or changing the check for the title from an equals to a contains for a constant part of the title should fix the problem. Coded UI often searches for more values than the minimum set needed.

    Compare the search properties etc for the same control in the two recorded tests.

    Update based extra detail given in the comments:

    I solved a similar problem as follows. I copied property code similar to that shown in your question into a method that called FindMatchingControls. I checked how many controls were returned, in my case up to 3. I examined various properties of the controls found, by writing lots of text to a debug file. In my case I found that the Left and Top properties were negative for the unwanted, ie hidden, controls.

    For your code rather than just using the UIAbmeldenImage property, you might call the method below. Change an expression such as

    HtmlImage im = UIMap.abc.def.UIAbmeldenImage;
    

    to be

    HtmlImage im = FindHtmlHyperLink(UIMap.abc.def);
    

    Where the method is:

    public HtmlImage FindHtmlHyperLink(HtmlDocument doc)
    {
        HtmlImage myImage = new HtmlImage(doc);
        myImage.SearchProperties[HtmlImage.PropertyNames.Id] = null;
        myImage.SearchProperties[HtmlImage.PropertyNames.Name] = null;
        myImage.SearchProperties[HtmlImage.PropertyNames.Alt] = "abmelden";
        myImage.FilterProperties[HtmlImage.PropertyNames.AbsolutePath] = "/webakte-vnext/content/apps/Ordner/images/logOut.png";
        myImage.FilterProperties[HtmlImage.PropertyNames.Src] = "http://localhost/webakte-vnext/content/apps/Ordner/images/logOut.png";
        myImage.FilterProperties[HtmlImage.PropertyNames.LinkAbsolutePath] = "/webakte-vnext/e.consult.9999/webakte/logout/index";
        myImage.FilterProperties[HtmlImage.PropertyNames.Href] = "http://localhost/webakte-vnext/e.consult.9999/webakte/logout/index";
        myImage.FilterProperties[HtmlImage.PropertyNames.Class] = null;
        myImage.FilterProperties[HtmlImage.PropertyNames.ControlDefinition] = "alt=\"abmelden\" src=\"http://localhost/web";
        myImage.FilterProperties[HtmlImage.PropertyNames.TagInstance] = "1";
        myImage.WindowTitles.Add("Akte - Test Akte Coded UI VS2010");
    
        UITestControlCollection controls = myImage.FindMatchingControls();
    
    
        if (controls.Count > 1)
        {
            foreach (UITestControl con in controls)
            {
                if ( con.Left < 0 || con.Top < 0 )
                {
                    // Not on display, ignore it.
                }
                else
                {
                    // Select this one and break out of the loop.
                    myImage = con as HtmlImage;
                    break;
                }
            }
        }
    
        return myImage;
    }
    

    Note that the above code has not been compiled or tested, it should be taken as ideas not as the final code.

提交回复
热议问题