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

Мне нужно получить доступ к полю ввода в HTML ниже. При настройке страницы мне нужно выполнить цепочку, используя текст "Адресная строка 1", а затем отправить текст в поле ввода. Идентификатор поля ввода изменяется, поэтому расположение полей не зависит от предпочтений пользователя. Я борюсь. Если вам нужна дополнительная информация, не стесняйтесь спрашивать, я не хочу перегружать слишком много информации.

<td class="labelCol requiredInput">
  <label for="00N36000000xina"><span class="assistiveText">*</span>Address Line 1</label>
</td>
<td class="dataCol col02">
  <div class="requiredInput">
    <div class="requiredBlock"></div>
    <input id="00N36000000xina" maxlength="255" name="00N36000000xina" size="20" tabindex="4" type="text">
  </div>
</td>

Я получил доступ так:

element(by.css('div.pbSubsection:nth-child(3) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2) > input'))

Однако в зависимости от того, куда пользователь помещает поля, он может перемещаться. Так что я надеялся получить доступ к метке \ и использовать ее для точного определения поля ввода.

3 ответа

Решение

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

Начните с поиска элемента по XPath, "//label[text()='Address Line 1']", Это ищет LABEL тег, который содержит "Адресную строку 1". Как только вы найдете этот элемент, получите label приписывать. Из вашего HTML это label это id для INPUT элемент, который вы хотите. Теперь используйте id найти элемент и делать с ним то, что вы хотите.

id = element(by.xpath("//label[text()='Address Line 1']")).getAttribute("label")
input = element(by.id(id))
input.sendkeys("some text")

Сам не проверял, но вы можете попробовать что-то вроде этого:

// $ is shorthand for element(by.css())
$('div.assistiveText').getAttribute('for').then(function (val) {

    // locate the <input> by the value of the attribute on <label>
    element(by.id(val)).sendKeys('abc'); // replace sendKeys with your intended function

});

Или, если этот первый локатор на ярлыке недостаточно конкретен, меняйте местами $('div.assistiveText') за element(by.cssContainingText('Address Line 1'))

Я пробовал это для других атрибутов (у меня нет for атрибут в любом месте моего приложения), и это, похоже, работает для меня.

Попробуй это:

        List<WebElement> elementList = driver.findElements(By.cssSelector("tbody > tr"));
        for (WebElement element : elementList) {
            if(element.findElement(By.cssSelector("td.labelCol > label")).getText().equalsIgnoreCase("Address Line 1")) {
                element.findElement(By.cssSelector("input[type='text']")).sendKeys("textToInput");
            }
        }
Другие вопросы по тегам