selenium-webdriver(c#)-迭代选择菜单的最佳方式-然后验证元素样式更新
本文关键字:验证 方式 然后 元素 更新 样式 最佳 菜单 迭代 selenium-webdriver 选择 | 更新日期: 2023-09-27 18:28:20
我想遍历选择菜单中的所有可用选项,依次单击每个选项,然后验证单击每个选项是否会更新具有宽度和高度值的特定元素。
这是选择菜单的代码:
<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>
当我点击每个选项时,位于页面其他地方的另一个元素中的值将发生变化(见下文)-选择时,任何下拉选项都没有应用"选定"属性(除了默认选项),因此我无法基于"选定"的属性断言选择。
我要做的(我还没有在样本中编码)是,当选择特定的选择选项时,另一个页面元素(如下所示)将更新以保存新的宽度和高度值:
<div id="Container" class="page" style="width: 547px; height: 865px; data-loaded="true">
以下是我到目前为止的想法-注意,我知道我还没有断言任何
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);
}
}
我真的只是想确认一下这是否是解决这个问题的最佳方式。我之所以这么问,是因为我基本上简化了上面的代码示例,实际上我有50多个选择选项要验证——更不用说我还有许多其他选择菜单,其中包含了许多选项以实现自动化。
这里有几个问题。
第一个是for
循环不是你想要做的
第二个是Selenium在SelectElement
类中为您包装了所有"在选择中为我查找选项"功能,因此您不必首先这样做:
第三,XPath构造在很大程度上是基于位置的。位置不好,因为它是可以改变的东西。如果我在列表的顶部添加一个选项,你的测试就会失败,而它不应该失败。我没有破坏应用程序的功能,只是更改了列表顺序,您的测试将失败。
第四个问题是,您持有对元素的引用,并且您已经说过,当您单击该选项时,页面将发生更改。这可能导致StaleReferenceException
,具体取决于单击的实际操作。我说可能,因为不应该但如果您的应用程序被编码为执行某些导致Selenium认为"对此的引用不再有效"的操作,它将抛出异常。
第五个问题是您正在循环一个object
的数组,这是不必要的。你知道他们的类型。是IWebElement
。如果您只是将类定义为Object
,那么您就没有充分利用它的力量。
最后一个问题是您正在使用Thread.Sleep
。很明显,您正在等待某个东西,所以在Selenium中使用显式等待来实际等待某个东西,而不是"让我们等待几秒钟"。
https://github.com/SeleniumHQ/selenium/blob/master/dotnet/src/support/UI/SelectElement.cs
(记住硒是开源的)
SelectElement actualSizeSelect = new SelectElement(UtilityClass.driver.FindElement(By.Id("SizeSelect")));
这使您能够通过文本进行搜索:
actualSizeSelect.SelectByText("10");
现在,你的测试将不在乎"10"到底在哪里!
这也将使您能够循环浏览给定select
中的所有选项,如
IList<IWebElement> options = actualSizeSelect.AllOptions;
现在,您有了该select
中的option
的列表。让我们循环浏览一下:
foreach (IWebElement option in options)
{
option.Click(); // just a demo to show you.
}