selenium webdriver(c#)-循环访问选择菜单的最佳方法-然后验证元素样式是否更新?

Ban*_*axx 1 c# selenium webdriver selenium-webdriver

我想遍历选择菜单中的所有可用选项,依次单击每个选项,然后确认单击每个选项将用宽度和高度值更新特定的元素。

这是选择菜单的代码:

 <span id="SizeSelectContainer" class="dropdownButton" style="min-width: 100px; max-width: 120px;">
            <select id="SizeSelect" title="Zoom" tabindex="23" data-l10n-id="zoom" style="min-width: 126px;">
                <option id="SizeAutoOption" title="" value="auto" selected="selected" data-l10n-id="pagesizeauto">Automatic Size</option>
                <option id="SizeActualOption" title="" value="page-size-actual" data-l10n-id="pagesizeactual">Actual Size</option>
                <option title="" value="0.1">10</option>
                <option title="" value="0.5">50</option>
                <option title="" value="1">100</option>                         
            </select>
        </span>
Run Code Online (Sandbox Code Playgroud)

当我单击每个选项时,位于页面其他位置的另一个元素内的值将更改(请参见下文)-选中后,除下拉选项(默认选项)外,没有任何“选择”属性应用于任何下拉选项无法基于“选定”属性断言选择。

我要做的事情(我尚未在示例中进行编码)是,当选择了特定的选择选项时,另一个页面元素(如下所示)将更新以容纳新的宽度和高度值:

<div id="Container" class="page" style="width: 547px; height: 865px; data-loaded="true">
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止提出的-请注意,我还没有断言

        IWebElement AutoSize = UtilityClass.driver.FindElement(By.Id("SizeAutoOption"));
        IWebElement ActualSize = UtilityClass.driver.FindElement(By.Id("SizeActualOption"));

        IWebElement Ten = UtilityClass.driver.FindElement(By.XPath("//*[@id='SizeSelect']/option[3]"));
        IWebElement Fifty = UtilityClass.driver.FindElement(By.XPath("//*[@id='SizeSelect']/option[4]"));
        IWebElement Hundred = UtilityClass.driver.FindElement(By.XPath("//*[@id='SizeSelect']/option[5]"));  

        Object[] SelectElements = new Object[] { AutoSize, ActualSize, Ten, Fifty, Hundred };

        for (int i = 0; i < SelectElements.Count(); i++)
        {
            if (i == 0)
            {
                AutoSize.Click();
                System.Threading.Thread.Sleep(1000);
            }
            else if (i == 1)
            {
                ActualSize.Click();
                System.Threading.Thread.Sleep(1000);
            }
            else if (i == 2)
            {
                Ten.Click();
                System.Threading.Thread.Sleep(1000);
            }
            else if (i == 3)
            {
                Fifty.Click();
                System.Threading.Thread.Sleep(1000);
            }
            else if (i == 4)
            {
                Hundred.Click();
                System.Threading.Thread.Sleep(1000);
            }
         }
Run Code Online (Sandbox Code Playgroud)

我真的只是在寻找一些确认,以确认这是否是实现此目标的最佳方法。我问的原因是我实质上简化了上面的代码示例,实际上我有50多个选择选项可进行验证-更不用说我还有许多其他选择菜单,其中包含的许多选项可以自动化。

Arr*_*ran 5

您在这里遇到了几个问题。

首先是for循环不是您想要执行的。

第二个是Selenium在SelectElement类中为您包装了所有“在select中给我一个选项”功能,因此您不必首先这样做:

第三是您的XPath构造很大程度上取决于位置。位置不好,因为它可以改变。如果我在该列表的顶部添加了一个选项,则您的测试将失败,并且应该不会。我没有破坏应用程序的功能,只是改变了列表顺序,而您的测试将失败。

第四个问题是您持有对元素的引用,并且您说单击选项时页面将发生变化。这可能导致StaleReferenceException依赖于单击实际执行的操作。我说这可能是因为它不应该,但是如果您的应用程序被编码为导致Selenium认为“对此的引用不再有效”,它将抛出异常。

第五个问题是您要遍历一个objects 数组,这是不必要的。你知道他们的类型。是IWebElement。如果仅将类定义为,则不会利用该类的功能Object

最后一个问题是您正在使用Thread.Sleep。您显然正在等待某事,因此请使用Selenium中的显式等待来实际等待某事,而不是“让我们等待几秒钟”。

https://github.com/SeleniumHQ/selenium/blob/master/dotnet/src/support/UI/SelectElement.cs

(请记住,Selenium是开源的)

SelectElement actualSizeSelect = new SelectElement(UtilityClass.driver.FindElement(By.Id("SizeSelect")));
Run Code Online (Sandbox Code Playgroud)

然后,您便可以按文本进行搜索:

actualSizeSelect.SelectByText("10");
Run Code Online (Sandbox Code Playgroud)

现在,您的测试将不在乎列表“ 10”中的确切位置!

这也使您能够遍历给定条件中的所有选项,如下select所示:

IList<IWebElement> options = actualSizeSelect.AllOptions;
Run Code Online (Sandbox Code Playgroud)

现在,您option在其中有一个的列表select。因此,让我们遍历它们:

foreach (IWebElement option in options) 
{
    option.Click(); // just a demo to show you.
}
Run Code Online (Sandbox Code Playgroud)