Как выбрать те же значения в раскрывающемся списке, что и в значениях структуры спецпотока - PullRequest
0 голосов
/ 03 июля 2019

В настоящее время я создаю автоматические тесты для формы заявки, в которой я использую селен в сочетании со Specflow. В моем сценарии Specflow у меня есть сценарий с несколькими примерами, которые я хочу использовать. У меня нет проблем с заполнением простых текстовых полей значениями из примера в схеме сценария, но я не могу получить селен, чтобы выбрать из раскрывающегося списка тот же элемент, что и у меня в схеме сценария specflow.

Шаг схемы сценария Specflow

Пример данных схемы сценария Specflow

Отправка данных из примера

Поиск и заполнение текстового поля

Как бы я продублировал это, но вместо того, чтобы заполнять текстовое поле, я хочу выбрать элемент в раскрывающемся списке, который совпадает со значением в схеме сценария specflow?

В настоящее время у меня есть созданный шаг и пример, но я не знаю, как правильно отправить данные, поймать и щелкнуть нужный элемент в раскрывающемся списке

Шаг схемы сценария Specflow для выпадающего списка

Пример данных схемы сценария Specflow для выпадающих элементов

РЕДАКТИРОВАТЬ 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 голосов
/ 03 июля 2019

Я обычно использую строковый формат для этого. Я не уверен, как выглядит ваша 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();
}

**** Обновление *** иди сюда https://www.w3schools.com/html/tryit.asp?filename=tryhtml_elem_select если вы посмотрите на xpath

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

    }
0 голосов
/ 03 июля 2019

Вот подход, который должен работать.

[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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...