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多个选择选项可进行验证-更不用说我还有许多其他选择菜单,其中包含的许多选项可以自动化。
您在这里遇到了几个问题。
首先是for
循环不是您想要执行的。
第二个是Selenium在SelectElement
类中为您包装了所有“在select中给我一个选项”功能,因此您不必首先这样做:
第三是您的XPath构造很大程度上取决于位置。位置不好,因为它可以改变。如果我在该列表的顶部添加了一个选项,则您的测试将失败,并且应该不会。我没有破坏应用程序的功能,只是改变了列表顺序,而您的测试将失败。
第四个问题是您持有对元素的引用,并且您说单击选项时页面将发生变化。这可能导致StaleReferenceException
依赖于单击实际执行的操作。我说这可能是因为它不应该,但是如果您的应用程序被编码为导致Selenium认为“对此的引用不再有效”,它将抛出异常。
第五个问题是您要遍历一个object
s 数组,这是不必要的。你知道他们的类型。是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)
归档时间: |
|
查看次数: |
5440 次 |
最近记录: |