Как найти элемент с нестатическим идентификатором с помощью Selenium Webdriver C #

1

Я хочу иметь возможность отправлять текст в этот элемент текстового поля:

<form class="compose okform initialized">

    <div class="border"></div>
    <div id="message_9028519832635440005Container" class="inputcontainer textarea empty">
        <textarea class="clone" placeholder="Compose your message" aria-hidden="true" style="height: 21px; width: 417px; line-height: 18px; text-decoration: none; letter-spacing: 0px;" tabindex="-1"></textarea>
        <textarea id="message_9028519832635440005" placeholder="Compose your message" style="height: 39px;"></textarea>

        <span class="okform-feedback message empty" style="height: 0"></span>
        <div class="icon okicon"></div>
    </div>
    <button class="flatbutton" type="submit"></button>
    <div class="draft_message"></div>
    <label class="checkbox" for="enter_to_send_9028519832635440005"></label>

</form>

Я не могу разместить элемент, выполнив поиск части идентификатора (число после того, как сообщение_ динамически генерируется).

Я также пробовал это, но я получаю сообщение об ошибке "неизвестная ошибка: не может сфокусировать элемент":

var textBox = DriverActions.driver.FindElements(By.ClassName("inputcontainer"));
textBox[0].SendKeys("Why hello");
Теги:
xpath
selenium-webdriver
css-selectors

2 ответа

0
Лучший ответ

Попробуйте этот XPath, используя start-with

var textBox= DriverActions.driver.FindElement(By.XPath(".//textarea[starts-with(@id,'message_')]"));
textBox.SendKeys("Why hello");

Причина, по которой вы получаете ошибку, может быть вызвана тем, что в вашем селекторе вы получите div вместо textBox поля, который вам нужен.

1

Попробуйте следующее css

.inputcontainer.textarea.empty>textarea:nth-child(1)

Я предположил, что вы хотите, чтобы в первом поле текстовой области с помощью placeholder="Compose your message" если это так, вы также можете использовать следующий cssSelector

[placeholder='Compose your message'][class='clone']

Также возможен частичный поиск с идентификатором. Предполагая, что часть контейнера идентификатора div уникальна и статична, вы можете сделать следующее

[id$='Container']>textarea:nth-child(1)

С другой стороны, если вы хотите, чтобы вторая текстовая область просто меняла дочерний индекс

[id$='Container']>textarea:nth-child(2)

И вот реализация

By byCss = By.CssSelector("[id$='Container']>textarea:nth-child(1)");
IWebElement textBox = driver.FindElement(byCss);
textBox.SendKeys("Why hello");
  • 0
    Спасибо, я многому научился из вашего объяснения. Но там написано «элемент не виден». Я попытался использовать метод, предложенный ниже, и это сработало для меня.
  • 0
    @MJJ_PDX Какой из них возвращает элемент, не видимый ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню