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

Posted

技术标签:

【中文标题】如何在下拉列表中选择与 specflow 大纲值相同的值【英文标题】:How to choose the same values in a dropdownlist as in specflow outline values 【发布时间】:2019-11-13 22:35:37 【问题描述】:

我目前正在为我将 selenium 与 Specflow 结合使用的应用程序表单创建自动测试。 在我的 Specflow 场景中,我有一个场景大纲,其中包含一些我希望使用的示例。使用场景大纲中示例中的值填充简单文本字段没有问题,但我似乎无法让 selenium 从下拉列表中选择与我在 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(); 

【问题讨论】:

嗨 - 您可以将您的代码发布到您的问题中吗? 遗憾的是,我无法发布所有代码,因为它包含我无法分享的信息,我已经在图像中附加了所有相关和需要的代码,应该足够了 您需要做的是审查您的代码,以便将very_important_information 更改为难以置信的_useless_information。人们通常无法点击 S/O 之外的链接,因此我建议发布您的审查代码以获得答案。 【参考方案1】:

我通常为此使用字符串格式。我不确定您的 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();

    

【讨论】:

感谢您的建议。我遇到的问题是我需要通过架构中的另一层(页面)传递值,就像我在文本字段(img 3)中所做的那样,然后在步骤中获取值并将其发送到形式。我目前用于图层页面的代码如下所示,但这不起作用,因为它没有选择与我在功能大纲中相同的值 图层页面代码: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 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[text()='0 ']", 值))).Click(); 【参考方案2】:

这是应该可行的方法。

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

【讨论】:

感谢您的回答!遗憾的是,这对我不起作用,因为我需要在步骤之前将特征轮廓中的值传递到另一层,上面的评论中的附加信息 driver.FindElement(By.XPath("//ul[@class='dropdown-menu show']//li[@role='presentation']//a[@class='dropdown-item']")).SendKeys(value); 这看起来不正确,因为您正在尝试将值发送到链接。而是将方法行更改为如下driver.FindElement(By.XPath("//ul[@class='dropdown-menu show']//li[@role='presentation']//a[@class='dropdown-item'][nomalize-space(.)=value]")).click();

以上是关于如何在下拉列表中选择与 specflow 大纲值相同的值的主要内容,如果未能解决你的问题,请参考以下文章

Specflow:将许多属性测试数据从背景传递到场景大纲的解决方案?

SpecFlow:场景大纲示例

具有多个场景的 Specflow 场景大纲

Specflow - 场景大纲不会生成示例步骤

您可以在 SpecFlow 的场景大纲中标记各个示例吗?

Specflow 场景大纲未按预期工作