我目前正在为将硒与Specflow结合使用的申请表创建自动测试。 在我的Specflow场景中,我有一个场景大纲,其中包含一些我想使用的示例。我可以使用场景概述中示例中的值填充简单文本字段,但是我似乎无法像在我的Specflow场景概述中一样,从硒中选择从下拉列表中选择相同的项目。
Specflow scenario outline step
Specflow scenario outline example data
Sending the data from the example
Cathing and populating the text field
我将如何重复此操作,但我不想填充文本字段,而是希望在下拉列表中选择与specflow方案大纲中的值相同的项目?
当前我已创建步骤和示例,但我不知道如何正确发送数据并捕获并单击下拉列表中的正确项目
Specflow scenario outline step for dropdown
Specflow scenario outline example data for drop down items
编辑1: 我为图层和步骤页面尝试过的当前代码
成功单击了下拉菜单,但没有选择与功能概述中相同的值
public string MaritalStatus
{
set
{
_driver.FindElement(By.Id("mainApplicant.maritalStatus")).Click();
_driver.FindElement(By.XPath("//ul[@class='dropdown-menu show']//li[@role='presentation']//a[@class='dropdown-item']")).SendKeys(value);
}
}
[Then(@"I choose value (.*) in dropdown MainApplicantMaritalStatus and Check Value")]
public void ThenIChooseValueInDropdownMainApplicantMaritalStatusAndCheckValue(string value)
{
_cashLoanPage.MaritalStatus = value;
}
成功单击了下拉列表,但仅选择了下拉列表中的第一项
public void MaritalStatus1()
{
_driver.FindElement(By.Id("mainApplicant.maritalStatus")).Click();
_driver.FindElement(By.XPath("//ul[@class='dropdown-menu show']//li[@role='presentation']//a[@class='dropdown-item']")).Click();
}
[Then(@"I choose value (.*) in dropdown MainApplicantMaritalStatus and Check Value")]
public void ThenIChooseValueInDropdownMainApplicantMaritalStatusAndCheckValue1(string x)
{
_cashLoanPage.MaritalStatus1();
}
编辑2: 在Dazed的帮助下,此代码可以按预期工作,以防万一有人偶然遇到类似问题
public void MaritalStatus(string value)
{
_driver.FindElement(By.Id("mainApplicant.maritalStatus")).Click();
_driver.FindElement(By.XPath(string.Format("//ul[@class='dropdown-menu show']//li[@role='presentation']//a[text()='{0}']", value))).Click();
}
答案 0 :(得分:0)
这是应该起作用的方法。
[Then(@"I choose (.*) in dropdown MainApplicantMaritalStatus and Check value")]
public void IChooseInDropdownMainApplicantMaritalStatusAndCheckValue(string status)
{
// lets say you have select element
WebElement maritalStatus = driver.findElement();
WebElement option = maritalStatus.findElement(By.xpath("./option[normalize-space(.)='" + status + "']"));
// click on option
option.click();
}
答案 1 :(得分:0)
我通常为此使用字符串格式。我不确定您的html标记是什么样子,但这将采用您从场景概述中传入的“值”,并将其替换为您的定位器类型(在本例中为xpath)。
[Then(@"I choose (.*) in dropdown MainApplicantMaritalStatus and Check value")]
public void IChooseInDropdownMainApplicantMaritalStatusAndCheckValue(string value)
{
driver.FindElement(By.XPath(string.Format("//select[@id='status']/option[text()='{0}']",
value))).Click();
}
****更新*** 如果您查看
的xpath,请转到https://www.w3schools.com/html/tryit.asp?filename=tryhtml_elem_select//select[@name='cars']/option ---- you get 4 results
如果我添加此
//select[@name='cars']/option[contains(text(), 'Saab')] -- you get one result
如果我将代码的路径更改为此,则可以传入我想要选择的值。
string value = "Saab";
driver.FindElement(By.XPath(string.Format("//select[@name='cars']/option[contains(text(), '{0}')]", value))).Click();
因此,使用您的代码,看起来您正在使用POM?您可以将其作为方法添加到页面中,然后从步骤中调用它。由于我们看不到您的完整html,因此我可以为您提供下拉值的确切xpath。
从步骤:
string myValue = "Married"
Pages.MyPage.SetMaritalStatus(string myValue);
来自页面:
public void SetMaritalStatus(string value)
{
_driver.FindElement(By.Id("mainApplicant.maritalStatus")).Click();
_driver.FindElement(By.XPath(string.Format("//ul[@class='dropdown-menu show']//li[@role='presentation']//a[@class='dropdown-item']/option[text()='{0}']", value))).Click();
}