Выберите текстовое поле в месте, где у меня есть совпадение для данных заголовка и данных в первом столбце - PullRequest
0 голосов
/ 14 марта 2019

Вот так выглядит моя страница, на которой мне нужно работать.

enter image description here

DOM выглядит так

Сценарий: - Мне нужно пройти таблицу и там, где данные заголовка (BH001 и т. Д.) И данные первого столбца (ABC и т. Д.) Совпадают с данными, введенными пользователем, мне нужно щелкнуть соответствующее текстовое поле.

Я написал указанный ниже код, но он не работает: -

public static void getMarksBox(WebDriver driver, String user, String taskCode) {
    UserData userNm = TestData.findUserById(user);
    String userName = userNm.getName();
    WebElement table = WaitUtils.waitForElement(driver, By.cssSelector("table.eds-o-table.cvr-c-table--marksbook"));
    List<WebElement> tableCols = table.findElements(By.cssSelector("td.eds-o-table__cell"));
    int columnIndex = -1;
    for(int i=1; i<tableCols.size();i++)
    {
        if(userName.equals(tableCols.get(i).findElement(By.cssSelector(".v-label-cvr-c-data-nav-link")).getText()))
        {
            columnIndex = i;
            break;
        }
    }
    List<WebElement> tableRows = table.findElements(By.cssSelector("tr.eds-o-table__row"));
    List<WebElement> tableHeaders = tableRows.get(1).findElements(By.cssSelector(".v-label-cvr-u-margin-right--sm"));
    WebElement textBox = table.findElement(By.cssSelector(".v-textfield"));
    for(WebElement header :tableHeaders)
    {
        if(taskCode.equals(header.getText()))
        {
            textBox = tableRows.get(columnIndex);
            textBox.click();
            WaitUtils.sleepInSeconds(5);
            break;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Как подсказывает @supputuri, вы можете найти соответствующую строку или ячейку напрямую через селектор XPath / Css, чтобы избежать сложного цикла для сокращения времени выполнения.

public static void getMarksBox(WebDriver driver, String user, String taskCode) {

  UserData userNm = TestData.findUserById(user);
  String userName = userNm.getName();

  WebElement table = WaitUtils.waitForElement(driver, 
        By.cssSelector("table.eds-o-table.cvr-c-table--marksbook"));

  WebElement matchedRow = table.findElement(By.xpath(
        String.format("./tobdy/tr[td[1][normalize-space(.)='%s']]", userName)))

  WebElement matchedTextBox = matchedRow.findElement(
        By.cssSelector("./td:nth-child(2) input.v-textfield-eds-c-input"))

  matchedTextBox.click()

  // or you can directly find the matchedTextBox in one findElement
  String xpath = String.format(
       "./tobdy/tr[td[1][normalize-space(.)='%s']]" + 
       "/td[2]//input[contains(@class,'v-textfield-eds-c-input')]", userName)
  WebElement matchedTextBox = table.findElement(By.xpath(xpath))
  matchedTextBox.click()   
}
0 голосов
/ 14 марта 2019

Используйте это ниже xpath для прямого доступа к блоку ввода, а не для циклов, которые вы написали в вышеописанном методе.

//td[position()=count(//th[contains(.,'First Name')]/preceding-sibling::th)+1 and normalize-space(.)='ABC']/ancestor::tr//td[position()=count(//th[contains(.,'BH001')]/preceding-sibling::th)+1]//input[contains(@class,'v-textfield-eds-c-input')]

Вот общие обозначения:

//td[position()=count(//th[contains(.,'your reference column name')]/preceding-sibling::th)+1 and normalize-space(.)='reference value']/ancestor::tr//td[position()=count(//th[contains(.,'target column name')]/preceding-sibling::th)+1]//input[contains(@class,'v-textfield-eds-c-input')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...