我有一个模式,在那个模式中有各种卡片。那些卡片掉了。看上去有点像下面的截图。他们都有不同的名字。有没有办法用C#编写方法,这样我就不必为所有下拉列表做//select@name=‘test1a’或//select@name='test1b‘?
下面的HTML代码
<table class="row-inner-table" border="0" cellpadding="1" cellspacing="1">
<tbody>
<tr class="row-content">
<td class="field-name">test1a</td>
<td class="field-value">
<select name="test-4" onchange="calc(document.myForm.TOTAL_8,this,24)">
<option value="" score="0"> </option>
<option value="118" score="0">test1b </option>
<option value="124" score="1">test1c</option>
<option value="120" score="2">test1d</option>
</select>
<input type="HIDDEN" name="PREVIOUS_24" value="0">
</td>
</tr>
<tr class="row-content">
<td class="field-name">test2</td>
<td class="field-value">
<select name="test-5" onchange="calc(document.myForm.TOTAL_8,this,25)">
<option value="" score="0"> </option>
<option value="121" score="0">hi</option>
<option value="113" score="1">hello</option>
<option value="114" score="2">C ya </option>
</select>
<input type="HIDDEN" name="PREVIOUS_25" value="0">
</td>
</tr>
<tr class="row-content">
<td class="field-name">test 3</td>
<td class="field-value">
<select name="test-6" onchange="calc(document.myForm.TOTAL_8,this,26)">
<option value="" score="0"> </option>
<option value="123" score="0">hehe</option>
<option value="112" score="1">haha</option>
<option value="119" score="2">001</option>
</select>
<input type="HIDDEN" name="PREVIOUS_26" value="0">
</td>
</tr>
<tr class="row-content">
<td class="field-name">test4</td>
<td class="field-value">
<select name="test-7" onchange="calc(document.myForm.TOTAL_8,this,27)">
<option value="" score="0"> </option>
<option value="111" score="0">404</option>
<option value="122" score="1">402/option>
<option value="117" score="2">403</option>
</select>
<input type="HIDDEN" name="PREVIOUS_27" value="0">
</td>
</tr>
<tr class="row-content">
<td class="field-name">test 5 </td>
<td class="field-value">
<select name="test-8" onchange="calc(document.myForm.TOTAL_8,this,28)">
<option value="" score="0"> </option>
<option value="115" score="0">Relaxed</option>
<option value="125" score="1">Tense, rigid</option>
<option value="116" score="2">Very tense or rigid</option>
</select>
<input type="HIDDEN" name="PREVIOUS_28" value="0">
</td>
</tr>
<tr class="row-content-total">
<td class="field-name total-label">Total</td>
<td class="field-value">
<input type="TEXT" size="5" name="TOTAL_8" value="0">
</td>
</tr>
</tbody>
</table>
发布于 2021-04-19 17:08:03
应该像这样的事情一样简单
public SelectElement dropdownElement(By locator)
{
return new SelectElement(driver.FindElement(locator));
}
你把它叫做
SelectElement select = dropdownElement(By.CssSelector("select[name='test-5']"));
发布于 2021-04-19 17:33:26
下面是C.C.Peck解决方案的另一个版本,它将减少重复的Xpath (或CSS)字符串代码,假设Xpath的基础始终与OP中的相同
public SelectElement SelectMenuItem(string menuValue)
{
var menuString = $"//select[@name='{menuValue}']";
return new SelectElement(driver.FindElement(By.XPath(menuString)));
}
SelectElement selectOne = SelectMenuItem("test-4");
SelectElement selectTwo = SelectMenuItem("test-5");
编辑
为了向你展示A的可重用性,它看起来应该是这样的.
方法返回带有动态Select Element
字符串的XPath
:
public SelectElement SelectMenuItem(string menuValue)
{
var menuString = $"//select[@name='{menuValue}']";
return new SelectElement(_driver.FindElement(By.XPath(menuString)));
}
方法通过XPath
为下拉列表设置值。
public void SetMenuValue(string menuValue, string menuDropDown)
{
SelectElement select = SelectMenuItem(menuDropDown);
select.SelectByText(menuValue);
}
最后,方法设置所需的特定值,首先传入value
,然后传入XPath
next:
public void Input_Values()
{
SetMenuValue("118", "test-4");
SetMenuValue("121", "test-5");
}
您不需要最后一个方法,您可以从任何地方调用SetMenuValue
,这只是另一个例子,说明了如何做到这一点
https://stackoverflow.com/questions/67166221
复制相似问题