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

Перетаскивание элементов(Drag and drop) на ползунке(Java)


(Михаил Ворон) #1

Привет. Перейду к сути дела:
Проблема заключается в том что я не знаю как реализовать перетаскивание предмета на ползунке. Перетаскивание происходит по пикселям. Приведите пожалуйста пример работы перетаскивания предмета на ползунке на Java


(Михаил Ворон) #2

Разобрался как делать. но возникла другая ошибка.

У меня не работает перетаскивание ползунка. Судя по ошибке - не находиться селектор. Хотя я его указал верно. Побывал разные варианты селекторов xpath и CSS. Попробовал запускать в разных браузерах.

Мои селекторы:

xpath:

.//*[@id=‘block_1’]/div[2]/div/div[2]/div[7]

.//*[@class=‘t76_js_min_cursor’]" - улучшенный вариант

CSS:

.t76_js_min_cursor

Вот код:

package Komus.example;


import java.util.concurrent.TimeUnit;


import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;


public class UseSlider {


private static final String url = "http://www.komus.ru/catalog/7237/_s/feat/p%5D%5B1.t%5D%5B1.f1_~2594~:%5D012942%5B1.~2595~:%5D021942%5B_1.r%5D%5B/";


public static void main(String[] args) {


WebDriver driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
try {
driver.get(url);
moveSlider(driver);


}


finally {
//driver.quit();
}
} 


private static void moveSlider (WebDriver driver) {


driver.switchTo().frame(0);
   WebElement slider = driver.findElement(By.xpath(".//*[@class='t76_js_min_cursor']"));
   Actions move = new Actions(driver);
   Action action = (Action) move.dragAndDropBy(slider, 60, 0).build();
   action.perform();
}


}

Вот ошибка:

Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"xpath","selector":".//*[@class='t76_js_min_cursor']"}
Command duration or timeout: 10.12 seconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.42.2', revision: '6a6995d', time: '2014-06-03 17:42:03'
System info: host: 'acer-aspire_v5', ip: '192.168.0.24', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_05'
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{applicationCacheEnabled=true, rotatable=false, handlesAlerts=true, databaseEnabled=true, version=30.0, platform=XP, browserConnectionEnabled=true, nativeEvents=false, acceptSslCerts=true, webStorageEnabled=true, locationContextEnabled=true, browserName=firefox, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: a2385d0c-3036-44ef-a0d2-c291deb8e29d
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:204)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:156)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:599)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:352)
at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:449)
at org.openqa.selenium.By$ByXPath.findElement(By.java:357)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:344)
at Komus.example.UseSlider.moveSlider(UseSlider.java:50)
at Komus.example.UseSlider.main(UseSlider.java:38)
Caused by: org.openqa.selenium.remote.ErrorHandler$UnknownServerException: Unable to locate element: {"method":"xpath","selector":".//*[@class='t76_js_min_cursor']"}
Build info: version: '2.42.2', revision: '6a6995d', time: '2014-06-03 17:42:03'
System info: host: 'acer-aspire_v5', ip: '192.168.0.24', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_05'
Driver info: driver.version: unknown
at <anonymous class>.FirefoxDriver.prototype.findElementInternal_(file:///C:/Users/user/AppData/Local/Temp/anonymous2138885446236210449webdriver-profile/extensions/fxdriver@googlecode.com/components/driver_component.js:9470:7)
at <anonymous class>.fxdriver.Timer.prototype.setTimeout/<.notify(file:///C:/Users/user/AppData/Local/Temp/anonymous2138885446236210449webdriver-profile/extensions/fxdriver@googlecode.com/components/driver_component.js:407:5)

(sidelnikovmike) #3

а зачем switchTo?


(sidelnikovmike) #4

Вообще завязываться на пиксели не очень хорошо.
Я у себя в тестах двигаю нажатием стрелочек(sendKeys(Keys.ARROW_LEFT)), правда у Вас видимо этот вариант не подойдет.
Еще встречал варианты, где люди вызывают напрямую javascript функцию, которая двигает слайдер.


(Михаил Ворон) #5

Да вы правы. Без switchTo все работает. Но у меня других вариантов нету просто. У вас видимо есть обозначения типа 1 2 3 4 5 и вы передвигаетесь между ними. А у меня только цена.


(Михаил Ворон) #6

А можете пример вашего теста привести? очень интерестно


(sidelnikovmike) #7

ну слайдер я двигаю вот тут:


справа фильтры, там слайдер , например, года выпуска.
По поводу теста - код посылки выглядит примерно так :
CharSequence[] keys = new CharSequence[movesCount];
Arrays.fill(keys, Keys.ARROW_RIGHT);
sliderStartPositionElement.sendKeys(keys);

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


#8

Чем закончилась история? сижу уже весь вечер с той же проблемой и ощыбкой.


(Bolatbek) #9
WebElement draggable = driver.findElement(By.xpath(xpath));
 
 new Actions(driver)
 .dragAndDropBy(draggable,10,10) // смещение в пикселях
 .build()
 .perform();

https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/interactions/Actions.html#dragAndDropBy-org.openqa.selenium.WebElement-int-int-