如何在下拉列表中选择与Specflow轮廓值相同的值

时间:2019-07-03 09:12:09

标签: c# selenium specflow

我目前正在为将硒与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(); 
}

2 个答案:

答案 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();

    }