Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

[Resolved] Как обработать в селениуме ссылку href ?


(Eugene) #1

Для обработки

 <A href="javascript:__doPostBack('ctl16$ctl00','')">Logout</A>  

использую

driver.findElement(By.linkText("Logout")).click();

но кнопка так и не жмакается. В чем ошибка? Как можно обработать в selenium данный случай. Спасибо.


(Keiga) #2

А просто по локатору пробовали?


(Eugene) #3

Например?


(Keiga) #4

Для примера предоставлено слишком мало кода страницы. Возможно ссылка в div’e или еще где, может в элементе с конкретным id. Тогда от окружающих элементов строим однозначный локатор до ссылки.


(Eugene) #5

Вот пример кода:

    public void testSample() throws Exception {
        
                driver.get(baseUrl);
                driver.findElement(By.id("loginContainer_username")).clear();
                driver.findElement(By.id("loginContainer_username")).sendKeys("qa1");
                driver.findElement(By.id("loginContainer_password")).clear();
                driver.findElement(By.id("loginContainer_password")).sendKeys("qa1");
                driver.findElement(By.name("loginContainer$ctl05")).click();
                driver.findElement(By.linkText("Logout")).click();
    }

id для Logout не могу найти((

<tr>
<td class="userinfo noWrap="nowrap" roSpan="1" colSpan="1">
<A href="javascript:__doPostBack('ctl16$ctl00','')">Logout</A>
<A href="javascript:__doPostBack('ctl16$ctl01','')">Profile</A>
</td>
</tr>

(Derom) #6

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


(Eugene) #7

Вот такая ошибка

org.openqa.selenium.NoSuchElementException: Unable to find element with link text == Logout (WARNING: The server did not provide any stacktrace information)


(Derom) #8

Два наиболее вероятных варианта: или ссылка в айфрейме. Или она просто не успевает появиться в коде страницы.


(Eugene) #9

“Или она просто не успевает появиться в коде страницы.” - Как сделать чтобы она появилась или успела появиться?


(Derom) #10

Добавить ожидание. Например,
new WebDriverWait(driver, 5).until(ExpectedConditions.presenceOfElementLocated(By.linkText(“Logout”)));
Но лучше бы увидеть живую страницу. Если что-то не публичное, можно ссылку в лс.


(Eugene) #11

К сожалению, часть кода:

new WebDriverWait(driver, 5).until(ExpectedConditions.presenceOfElementLocated(By.linkText("Logout")));

не решило проблему((
Ссылку тоже скинуть не могу, так как веб приложение развернуто на тестовом стенде, внутри корпоративной сети.

Мне кажется что там нужно использовать By.xpath, но то что я пишу:

driver.findElement(By.xpath("//*[@value='Logout']")).click();

пока тоже не работает


(Stan) #12

Тут не смогут помочь, пока ты либо не выложишь всю html страницу, либо не дашь на нее ссылку. Исходя из того что ты описал должно работать:

   driver.findElement(By.linkText("Logout")).click();

Если же нет, предоставь еще информацию.

Вообще не зацикливайся на поиске одного способа найти элемент. Почему например не

   driver.findElement(By.cssSelector("a:nth-child(1)")).click();

или не что-то производное с другими элементами?


(Derom) #13

Кстати, да. Можно сохранить страницу(лучше со стилями) в момент, когда пользователь уже авторизован и скинуть её сюда.


(Derom) #14

Должно быть так: //a[text()=‘Logout’] Но это аналогично By.linkText


(Eugene) #15

derom, СПАСИБО!!! Заработало!!! С меня пиво!))


(Сергей Блохин) #16

Можно немного оффтопа?
Почему ваши разработчики выбрали такой странный способ запуска JavaScript через протокол javascript: внутри href, а не через onclick?


(Stan) #17

это же postback, asp.net (https://msdn.microsoft.com/en-us/library/aa720099(v=vs.71).aspx)
тем более событийная модель через прямые onlick onmouseover и тд - 2000 год в разработке, все давно делается через addEventListener (postback по сути так и сделан, глубоко внутри)