如何在下拉列表中选择与 specflow 大纲值相同的值

How to choose the same values in a dropdownlist as in specflow outline values

我目前正在为我结合使用 selenium 和 Specflow 的申请表创建自动测试。 在我的 Specflow 场景中,我有一个场景大纲,其中包含一些我希望使用的示例。我在使用场景大纲示例中的值填充简单文本字段时没有问题,但我似乎无法从下拉列表中获取 selenium select 与我的 specflow 场景大纲中相同的项目。

Specflow scenario outline step

Specflow scenario outline example data

Sending the data from the example

Cathing and populating the text field

我将如何复制它,而不是填充文本字段,我想 select 下拉列表中与 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;
    }

成功单击下拉列表,但只有 select下拉列表中的第一项

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(); 
}

这是应该有效的方法。

[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();
}

我通常为此使用字符串格式。我不确定您的 html 标记是什么样的,但这将采用您从场景大纲传入的 "value" 并将其替换为您的定位器类型,在本例中为 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

如果我将代码中的路径更改为此,我可以传入我想要的值 select。

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

    }