我想迭代选择菜单中的所有可用选项,依次单击每个选项,然后验证单击每个选项将更新具有宽度和高度值的特定元素。
以下是选择菜单的代码:
<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>
当我点击每个选项时,位于页面其他位置的另一个元素中的值将发生变化(参见下文) - 选中时没有“选定”属性应用于任何下拉选项(除了默认选项) )所以我不能根据“选定”属性断言选择。
我要做的事情(我尚未在我的样本中编码)是当选择特定的选项时,另一个页面元素(如下所示)将更新以保存新的宽度和高度值: / p>
<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个选择选项来验证 - 更不用说我有许多其他选择菜单,其中包含尽可能多的选项以自动化。
答案 0 :(得分:4)
你在这里遇到了几个问题。
首先,for
循环不是您想要做的。
第二个是Selenium包装所有&#34;在选择中找到我的选项&#34; SelectElement
课程中的功能,因此您不必首先执行此操作:
第三是你的XPath结构很大程度上取决于位置。位置很糟糕,因为它可以改变。如果我在该列表的最顶部添加一个选项,那么您的测试将会中断,而不应该。我没有破坏应用程序功能,只是更改了列表顺序,您的测试将失败。
第四个问题是您持有对元素的引用,并且您已经说过单击该选项时页面会发生变化。这个可能会导致StaleReferenceException
依赖于点击实际执行的操作。我说可能因为不应该但如果您的应用程序被编码为执行某些导致Selenium思考的内容,那么对此的引用将不再有效#34;它会抛出异常。
第五个问题是你循环遍历object
的数组,这是不必要的。你知道他们的类型。它是IWebElement
。如果您只是将其定义为Object
,则无法利用该类的强大功能。
最后一个问题是您使用的是Thread.Sleep
。您显然正在等待某些事情所以在Selenium中使用显式等待实际等待某事而不是&#34;等待几秒钟&#34;。
https://github.com/SeleniumHQ/selenium/blob/master/dotnet/src/support/UI/SelectElement.cs
(记得Selenium是开源的)
SelectElement actualSizeSelect = new SelectElement(UtilityClass.driver.FindElement(By.Id("SizeSelect")));
然后,您可以按文本搜索:
actualSizeSelect.SelectByText("10");
现在,您的测试无法关注该列表中的确切位置&#34; 10&#34;是!
这也使您能够循环遍历给定select
内的所有选项,如下所示:
IList<IWebElement> options = actualSizeSelect.AllOptions;
您现在在option
内有select
个列表。所以让我们循环遍历它们:
foreach (IWebElement option in options)
{
option.Click(); // just a demo to show you.
}