Привет. Перейду к сути дела:
Проблема заключается в том что я не знаю как реализовать перетаскивание предмета на ползунке. Перетаскивание происходит по пикселям. Приведите пожалуйста пример работы перетаскивания предмета на ползунке на Java
Разобрался как делать. но возникла другая ошибка.
У меня не работает перетаскивание ползунка. Судя по ошибке - не находиться селектор. Хотя я его указал верно. Побывал разные варианты селекторов 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)
а зачем switchTo?
Вообще завязываться на пиксели не очень хорошо.
Я у себя в тестах двигаю нажатием стрелочек(sendKeys(Keys.ARROW_LEFT)), правда у Вас видимо этот вариант не подойдет.
Еще встречал варианты, где люди вызывают напрямую javascript функцию, которая двигает слайдер.
Да вы правы. Без switchTo все работает. Но у меня других вариантов нету просто. У вас видимо есть обозначения типа 1 2 3 4 5 и вы передвигаетесь между ними. А у меня только цена.
А можете пример вашего теста привести? очень интерестно
ну слайдер я двигаю вот тут:
справа фильтры, там слайдер , например, года выпуска.
По поводу теста - код посылки выглядит примерно так :
CharSequence[] keys = new CharSequence[movesCount];
Arrays.fill(keys, Keys.ARROW_RIGHT);
sliderStartPositionElement.sendKeys(keys);
ну следовательно есть методы для движения вправо и влево, на вход передается высчитываемое кол-во шагов.
Чем закончилась история? сижу уже весь вечер с той же проблемой и ощыбкой.
WebElement draggable = driver.findElement(By.xpath(xpath));
new Actions(driver)
.dragAndDropBy(draggable,10,10) // смещение в пикселях
.build()
.perform();