C # Selenium Календарь нажмите - PullRequest
0 голосов
/ 19 октября 2018

Надеюсь, все хорошо.У меня возникают трудности с выбором даты календаря.

По сути, я нажимаю на кнопку, когда появляется календарь, и когда я проверяю (Google Chrome) дату, нужно щелкнуть следующее td:

<td class="dxeCalendarDay" savedcursor="[object Object]" style="cursor: pointer;">1</td>

Я попробовал следующий код, но дал мне ошибку:

FromCalendar = Chromedriver.FindElement(By.Id("ctl00_MainContent_dpStart_DDD_C_mt"));
IWebElement FromCalendar1 = Chromedriver.FindElement(By.XPath("//tr/td[contains(text(), '>1<'")); //

FromCalendar1.Click();

Ошибка:

OpenQA.Selenium.InvalidSelectorException: 'invalid selector: Unable to locate an element with the xpath expression //ttr/td[contains(text(), '>1<' because of the following error:
SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//ttr/td[contains(text(), '>1<'' is not a valid XPath expression.

Надеюсь, кто-то может мне помочь.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Кажется, ты был довольно близко.Это сообщение об ошибке ...

OpenQA.Selenium.InvalidSelectorException: 'invalid selector: Unable to locate an element with the xpath expression //ttr/td[contains(text(), '>1<' because of the following error:
SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//ttr/td[contains(text(), '>1<'' is not a valid XPath expression.

... означает, что использованное вами XPath не является допустимым выражением XPath .

* 1009.* У вас есть две проблемы:
  • > и < являются частью тегов, поэтому не должны быть частью XPath Expression ,Поэтому вам нужно удалить их.
  • Вам нужно использовать contains() или text(), но не оба.
  • Выражение XPath должно быть в правильном формате.

Таким образом, ваше выражение XPath с небольшими изменениями будет выглядеть следующим образом:

IWebElement FromCalendar1 = Chromedriver.FindElement(By.XPath("//tr/td[@class='dxeCalendarDay'][text()='1']"));
//or
IWebElement FromCalendar1 = Chromedriver.FindElement(By.XPath("//tr/td[@class='dxeCalendarDay' and contains(.,'1')]"));

Далее, так как вы будете нажимать на элемент кнопки длячтобы появилось всплывающее окно с календарем, вам нужно активировать WebDriverWait , чтобы элемент можно было нажимать следующим образом:

new WebDriverWait(Chromedriver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//tr/td[@class='dxeCalendarDay'][text()='1']"))).Click();
//or
new WebDriverWait(Chromedriver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//tr/td[@class='dxeCalendarDay' and contains(.,'1')]"))).Click();

Примечание: ChromeDriver isзарезервированное ключевое слово , которое не следует использовать в качестве пользовательской переменной любой ценой.

0 голосов
/ 19 октября 2018

Проблема с вашим XPath заключается в том, что вы пытаетесь найти элемент по содержащемуся в нем тексту >1<.Этот элемент не содержит >1<, он содержит только 1.Измените его на //td[@class='dxeCalendarDay'][.='1'], и оно должно работать.

Глядя на ваш код, похоже, у вас есть другие проблемы.

Ваша первая строка ничего не делает ... Япредполагая, что вы хотели щелкнуть, чтобы открыть календарь?

Chromedriver.FindElement(By.Id("ctl00_MainContent_dpStart_DDD_C_mt")).Click();

В общем, если вы не собираетесь повторно использовать переменную, не беспокойтесь о сохранении ссылки на веб-элемент.Измените

IWebElement FromCalendar1 = Chromedriver.FindElement(By.XPath("//tr/td[contains(text(), '>1<'")); //
FromCalendar1.Click();

на

Chromedriver.FindElement(By.XPath("//tr/td[contains(text(), '>1<'")).Click();

Поскольку вы щелкаете элемент, и календарь открывается, вы должны предположить, что он может быть недоступен мгновенно, поэтому вам следует добавить ожидание.Ваш окончательный код будет выглядеть примерно так:

Chromedriver.FindElement(By.Id("ctl00_MainContent_dpStart_DDD_C_mt")).Click();
new WebDriverWait(Chromedriver, TimeSpan.FromSeconds(5)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//td[@class='dxeCalendarDay'][.='1']"))).Click();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...