Перейти к содержимому

Фотография

Переход по ссылке

Selenium link

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 10

#1 Dmitriy_BOL

Dmitriy_BOL

    Новый участник

  • Members
  • Pip
  • 29 сообщений


Отправлено 29 декабря 2015 - 18:34

Доброго времени суток.

Пишу робота для сайта и столкнулся с проблемой.

Ниже приведен код страницы

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<li id="l_msg">
<a class="left_row" onclick="return nav.go(this, event, {noback: true, params: {_ref: 'left_nav'}});" href="/im">
<span class="left_fixer">
<span class="left_count_pad left_count_persist" onclick="return (checkEvent(event) || browser.msie6) ? true : cancelEvent(event)" onmousedown="return Pads.show('msg', event)" onmouseover="Pads.preload('msg')">
<span class="left_count_wrap fl_r left_void" style="">
<span class="inl_bl left_count">+</span>
</span>
</span>
<span class="left_label inl_bl">Мои Сообщения</span>
</span>
</a>
</li>
</body>
</html>

Мне надо перейти по ссылке "Мои сообщения".

Для работы  использую Eclipse + Selenium 2.0 WebDriwer.

 

Пробывал сдедующую комбинацию:

 

WebElement element = driver.findElement(By.id("l_msg"));

element.click();

 

и

 

WebElement element = driver.findElement(By.linkText("Мои сообщения"));

element.click();

 

и я нимогу понять, я делаю что то не так или данный элемент чем то перекрывается.

 

Укажите куда "копать" пожалуйста.


  • 0

#2 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 29 декабря 2015 - 19:50

1. Вы не написали, что (точнее как) не срабатывает? :) Ошибки бывают разные - элемент не найден, либо найден, но недоступен и т.п.

2. Насколько я понимаю, #l_msg - это элемент списка, а By.linkText("Мои сообщения") - это span, который наоборот: лежит внутри ссылки (тоже может быть недоступен для Селениума).

Попробуйте кликнуть не по ним, а непосредственно по ссылке = driver.findElement(By.cssSelector("#l_msg a")).


  • 1

#3 Dmitriy_BOL

Dmitriy_BOL

    Новый участник

  • Members
  • Pip
  • 29 сообщений


Отправлено 30 декабря 2015 - 06:12

попробовал.... действий не происходит....код который  я привел это часть бара со ссылками разделов пользователя в контакте... и да, примеры которые я приводил здесь действий не производили.

 

вот тот код который я написал по вшему совету

 

ProfilesIni profiles = new ProfilesIni();
        FirefoxProfile myprofile = profiles.getProfile("TestQA");
        WebDriver driver = new FirefoxDriver(myprofile);
        driver.get("http://www.vk.com");
        WebElement element = driver.findElement(By.name("email"));
        element.sendKeys("мыло");
        element = driver.findElement(By.name("pass"));
        element.sendKeys("пароль");
        element = driver.findElement(By.id("quick_login_button"));
        element.click();
        element = driver.findElement(By.cssSelector("#l_msg a"));
        element.click();
        Thread.sleep(1000);
        driver.navigate().back();

 

Ну что то не хочет он нажимать на  ссылку.

 

Если можете еще что то подсказать буду признателен, и да спасибо за отклик.


  • 0

#4 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 30 декабря 2015 - 07:33

Если можете еще что то подсказать буду признателен, и да спасибо за отклик.
<span class="left_label inl_bl">Мои Сообщения</span>

тебе же на этот элемент нужно нажимать ...

element = driver.findElement(By.xpath("//span[contains(text(),'Мои сообщения')]"));

возможно, по ByLinkText не переходит потому что линк предполагает тег <a и аттрибут href ?


  • 0

#5 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 30 декабря 2015 - 09:26

Вы бы написали все таки - какую именно ошибку выдает селениум? NoSuchElementException? StaleElementReferenceException? Что-то другое?

Если приведенный код не полный, а лишь часть - может быть в полной версии есть фреймы?


  • 0

#6 Dmitriy_BOL

Dmitriy_BOL

    Новый участник

  • Members
  • Pip
  • 29 сообщений


Отправлено 30 декабря 2015 - 16:33

Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"id","selector":"l_msg"}
Command duration or timeout: 125 milliseconds
For documentation on this error, please visit: http://seleniumhq.or...ch_element.html
Build info: version: '2.48.2', revision: '41bccdd', time: '2015-10-09 19:59:12'
System info: host: 'dmitriy-K53SD', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.19.0-25-generic', java.version: '1.8.0_66'
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{applicationCacheEnabled=true, rotatable=false, handlesAlerts=true, databaseEnabled=true, version=39.0, platform=LINUX, nativeEvents=false, acceptSslCerts=true, webStorageEnabled=true, locationContextEnabled=true, browserName=firefox, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: 0052ba24-2278-449a-8f3b-b85feebcea5c
*** Element info: {Using=id, value=l_msg}
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:647)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:353)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:403)
    at org.openqa.selenium.By$ById.findElement(By.java:218)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:345)
    at demotest.test.main(test.java:30)
Caused by: org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"id","selector":"l_msg"}
For documentation on this error, please visit: http://seleniumhq.or...ch_element.html
Build info: version: '2.48.2', revision: '41bccdd', time: '2015-10-09 19:59:12'
System info: host: 'dmitriy-K53SD', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.19.0-25-generic', java.version: '1.8.0_66'
Driver info: driver.version: unknown
    at <anonymous class>.FirefoxDriver.prototype.findElementInternal_(file:///tmp/anonymous699142381579196097webdriver-profile/extensions/fxdriver@googlecode.com/components/driver-component.js:10659)
    at <anonymous class>.FirefoxDriver.prototype.findElement(file:///tmp/anonymous699142381579196097webdriver-profile/extensions/fxdriver@googlecode.com/components/driver-component.js:10668)
    at <anonymous class>.DelayedCommand.prototype.executeInternal_/h(file:///tmp/anonymous699142381579196097webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12534)
    at <anonymous class>.DelayedCommand.prototype.executeInternal_(file:///tmp/anonymous699142381579196097webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12539)
    at <anonymous class>.DelayedCommand.prototype.execute/<(file:///tmp/anonymous699142381579196097webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12481)

 

Вот стек ошибок, всем известно что сайт ВКонтакте наверстан дивами и не какого фрейма там нет.
 


  • 0

#7 Dmitriy_BOL

Dmitriy_BOL

    Новый участник

  • Members
  • Pip
  • 29 сообщений


Отправлено 30 декабря 2015 - 18:01

я решил проблему  применив

Thread.sleep(1000);

Как ни странно но после того как данные на форму автоизации были в ведены, я вызвал задержку, страница загрузилась и робот перешел по ссылке "Мои сообщения". Для опредпления ссылки я перепробывал все локаторы на сайте ВКонтакте. Из всех подошли By.xpath(".//*[@id='l_msg']/a") и By.id("l_msg").

 

Я не уверен что мое решение правильно так как вызов Thread.sleep(1000); увеличевает общее время выполнения всех задуманных действий роботом, но может комуто такое решение прийдется по вкусу.

 

 

А теперь кто может обьяснить внятно, понятно, емко, лаконично и даходчиво: "Почему из за поставленной мной системной задержки код начал работать? Ведь WebDriver работает напрямую с браузером, создавая монипуляции пользователя в нем, и когда он грузит страницу полностью, к примеру, он ожидает ее полной загрузки, а потом только выполняет действия на ней. Ведь с авторизацией в ВКонтакте посуте происходит тоже самое что и при полной загрузке страницы. Это очень тонкий момент, как по мне, и почитавшие ваш ответ на этот вопрос будут внимательнее относится к написанию роботов, соответственно и таких дуратских вопросов, как мой, будет меньше в разы.  ". Дайте внятный ответ пожалуйста.

 

Пы.Сы. Вот даю код который у меня работает отлично:

package demotest;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.internal.ProfilesIni;
import org.openqa.selenium.security.UserAndPassword;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;

public class test {
	public static void main(String[] args)throws NoSuchElementException,NullPointerException, InterruptedException {
		ProfilesIni profiles = new ProfilesIni(); 
		FirefoxProfile myprofile = profiles.getProfile("TestQA"); 
		WebDriver driver = new FirefoxDriver(myprofile);
		driver.get("http://www.vk.com");
		WebElement element = driver.findElement(By.name("email"));
		element.sendKeys("Ваш логин");
		element = driver.findElement(By.name("pass"));
		element.sendKeys("Ваш пароль");
		element = driver.findElement(By.id("quick_login_button"));
		element.click();
		Thread.sleep(1000);
		element = driver.findElement(By.id("l_msg"));//.id("l_msg"), .xpath(".//*[@id='l_msg']/a")
		element.click();
		
	}
}

  • 0

#8 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 31 декабря 2015 - 07:10

Я не уверен что мое решение правильно так как вызов Thread.sleep(1000); увеличевает общее время выполнения всех задуманных действий роботом, но может комуто такое решение прийдется по вкусу.

 

 

Читай про ожидания в селениум


  • 0

#9 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 11 января 2016 - 07:23

Попробуйте вместо 

Thread.sleep(1000);

поставить:

WebDriverWait wait = new WebDriverWait(driver, 5); 
wait.until(ExpectedConditions.elementToBeClickable(By.id("l_msg")));

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

В этом примере, 5 => максимальное время ожидания в секундах, после которого ожидание прекратится, будет считаться, что этого элемента нет (либо он некликабельный) и будет выдано TimeoutException.

 

(могут быть ситуации, когда элемент уже есть на странице, но, к примеру, до окончания какой-нибудь обработки - недоступен, поэтому elementToBeClickable, а не просто ожидание появления).


  • 0

#10 kopati4

kopati4

    Новый участник

  • Members
  • Pip
  • 3 сообщений
  • ФИО:Трофимов Константин
  • Город:Санкт-Петербург

Отправлено 11 января 2016 - 16:40

Вообще данный айдишник по сути никак не относится к ссылке, по который вы хотите кликнуть. Он относится к родительскому элементу этой самой ссылки. Мой совет - если хотите кликнуть по ссылке, то кликайте по самой ссылке. В данном случае Вам повезло, что родительский элемент совпадает с дочерним(ваша ссылка).


  • 0

#11 Dmitriy_BOL

Dmitriy_BOL

    Новый участник

  • Members
  • Pip
  • 29 сообщений


Отправлено 11 января 2016 - 19:11

спасибо всем.....материал усвоен)  


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных