Как найти динамический элемент и отправить текст через Selenium и C # - PullRequest
0 голосов
/ 06 декабря 2018

РЕДАКТИРОВАТЬ: Не уверен, действительно ли это помогает понять, но это на основе Sharepoint.

У меня есть элемент со специальным символом, который веб-драйвер не может найти.

var element = wait.Until(x => x.FindElement(By.Id("Tasrit_6aecdca9-e3b9-4141-ae36-d537784f9592_$TextField_inplacerte")));
element.SendKeys("foo");

Я полагаю, что именно $ вызывает проблему.

Наоборот, я нашел это с помощью:

var element = wait.Until(x => x.FindElements(By.CssSelector("div[id*='Tasrit_6aecdca9-e3b9-4141-ae36-d537784f9592']")));
element[2].FindElement(By.TagName("p")).SendKeys("foo");

Тест проходит этот путь (на первый взгляд), но значение на самом деле не отправляется в поле.К сожалению, в иерархии элемента нет тега input, и при вставке текста вручную я вижу, что значение было вставлено в тег <p>.Но, как показано, при использовании тега <p> это не очень помогает.

HTML:

<div class="ms-rtestate-write ms-rteflags-0 ms-rtestate-field" id="Tasrit_6aecdca9-e3b9-4141-ae36-d537784f9592_$TextField_inplacerte" role="textbox" aria-haspopup="true" aria-labelledby="Tasrit_6aecdca9-e3b9-4141-ae36-d537784f9592_$TextField_inplacerte_label" style="min-height: 84px;" contenteditable="true" aria-autocomplete="both" aria-multiline="true" RteDirty="true">
  <p>
    <span id="ms-rterangecursor-start" RteNodeId="1"></span>
    <span id="ms-rterangecursor-end"></span>
  ​</p>
</div>

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Вместо реализации двух FindElement* вы можете сделать это за один шаг следующим образом:

  • CssSelector:

    wait.Until(x => x.FindElement(By.CssSelector("div.ms-rtestate-write.ms-rteflags-0.ms-rtestate-field[id^='Tasrit_'][aria-labelledby$='_inplacerte_label']>p"))).SendKeys("foo");
    
  • XPath:

    wait.Until(x => x.FindElement(By.XPath("//div[@class='ms-rtestate-write ms-rteflags-0 ms-rtestate-field' and starts-with(@id,'Tasrit_')][contains(@aria-labelledby,'_inplacerte_label')]/p"))).SendKeys("foo");
    

Обновление

Однако этот элемент выглядит для меня динамически, поэтому вам нужно вызвать WebDriverwait длятребуемый элемент, на который можно кликать , и вы можете использовать любое из следующих решений:

  • CssSelector:

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("div.ms-rtestate-write.ms-rteflags-0.ms-rtestate-field[id^='Tasrit_'][aria-labelledby$='_inplacerte_label']>p"))).SendKeys("foo");
    
  • XPath:

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//div[@class='ms-rtestate-write ms-rteflags-0 ms-rtestate-field' and starts-with(@id,'Tasrit_')][contains(@aria-labelledby,'_inplacerte_label')]/p"))).SendKeys("foo");
    
0 голосов
/ 06 декабря 2018

Если SendKeys() не работает, вы можете попробовать использовать JavaScript

IWebElement webElement = element[2].FindElement(By.TagName("p"));
driver.ExecuteJavaScript("arguments[0].setAttribute('value', 'arguments[1]')", webElement, "foo");
0 голосов
/ 06 декабря 2018

И я предполагаю, что в идентификаторе этого элемента есть дополнительный пробел :) Попробуйте:

wait.Until(x => x.FindElement(By.Id("Tasrit_6aecdca9-e3b9-4141-ae36-d537784f9592_$TextField_inplacerte")));
element.Click();

Либо это , либо значение Id этого элемента в DOMразные , $TextField_inplacerte переменные, которые, например, анализируются.spaceMonkey, undefined, 5 и т. д. Откройте инструменты разработки, найдите элемент, щелкните правой кнопкой мыши, проверьте и подтвердите фактический идентификатор элемента в DOM.

Вы можете использовать API инструментов dev для поиска текста в DOM текущей открытой страницы (с этим элементом в нем), если он совпадает с Id, если нет, то в этом есть разница.Это может быть любая часть, например.6-й символ в Id отличается:)

Просто чтобы убедиться, что пробел между 1-й частью идентификатора и 24, который вы упоминаете, является проблемой, которую вы можете либо:

  1. посмотретькод веб-драйвера и посмотрите, что используется для доступа к элементам DOM

  2. загрузите jquery перед тестированием:

    var element = wait.Until (x => x.FindElements($ ('# id, содержащий пробелы')). SendKeys ("foo");

По сути, вместо использования способа поиска элемента с помощью веб-драйвера вы используете jQuery для получения ссылки на элементЕсли это работает, это проблема с пространством из-за плохого дизайна приложения, имеющего пространство в id элемента

Возможно, именно поэтому маршрут селектора CSS работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...