Невозможно найти Элемент по XPath, когда в Link есть Javascript - PullRequest
2 голосов
/ 25 марта 2019

Я пытаюсь получить элемент гиперссылки в Selenium, в котором ссылка фактически выполняет javascript. Я не могу получить его, несмотря на попытки нескольких разных методов.
<<ПРИМЕЧАНИЕ: я могу получить другие элементы управления - просто борюсь с этим>> Элемент выглядит следующим образом; пытается получить test1_decode one:

<section id="specialsection" role="tabpanel" aria-hidden="true">
<ul class="col4">
    <li  class="header2"><a href="javascript:SetApplication('test1_decode');">Example Application</a></li>
    <li  class="header2"><a href="javascript:SetApplication('test2_decode');">Example Application POC</a></li>
</ul>
</section>

Я пробовал следующее: FindElement с использованием XPath содержит текст ссылки, FindElement с использованием Xpath содержит текст, FindElement с помощью PartialLinkText, FindElement с помощью LinkText - все не удается.

Я даже пытался получить все в списке; Интересно, может быть, это потому, что у него высота 0?

//These are the different things I've tried:
IWebElement ExAppLogin = driver.FindElement(By.XPath("//a[contains(text(), 'Example Application')]"));

IWebElement ExAppLogin = driver.FindElement(By.XPath("//a[contains(@href, 'test1_decode')]"));

IWebElement ExAppLogin = driver.FindElement(By.PartialLinkText("test1_decode"));

IWebElement ExAppLogin = driver.FindElement(By.LinkText("test1_decode"));

IWebElement ExAppLogin = driver.FindElement(By.PartialLinkText("test1_decode"));

Все они генерируют исключение "Невозможно найти элемент с xpath ==" ...

Ответы [ 3 ]

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

Возможное решение
Так что было / было Iframes - спасибо всем, кто прокомментировал / ответил.
глядя на каждый из них в отладке в точке останова:

driver.FindElements(By.CssSelector("iframe"));
driver.FindElements(By.TagName("iframe"));
driver.WindowHandles;

Я определил, что были iframe. Поскольку это POC, я просто жестко запрограммировал, чтобы получить нужный фрейм:

driver.SwitchTo().Frame(2);

И я смог продвинуться дальше этого уровня. Странно то, что, несмотря на то, что мне удалось найти нужный элемент:

IWebElement ExAppLogin = driver.FindElement(By.XPath("//a[contains(@href, 'test1_decode')]"));

(т. Е. Я могу просмотреть сведения о переменной ExAppLogin в отладке, поскольку она не NULL / не исключение) Но если я сделаю это:

ExAppLogin.Click();

ничего не происходит!

Так что пока я могу продолжить, просто выполнив javascript:

IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("SetApplication('test1_decode');");

Как только я это сделаю, я столкнулся с другой проблемой , но для целей этого конкретного вопроса, я думаю, я могу считать это решенным - спасибо всем!

0 голосов
/ 25 марта 2019

Попробуйте следовать XPath. Если это не сработает, проверьте, есть ли в наличии iframe. И если, тогда вы должны сначала использовать Swith_to iframe для доступа к элементу.

WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(text(),'Example Application')][contains(@href,'test1_decode')]"))).click();;
0 голосов
/ 25 марта 2019

Вы можете попробовать следующий CSS

driver.findElement(By.cssSelector("a[href*='test1_decode']"));

*= будет соответствовать строке внутри атрибута href.

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