问题描述
嗨,我正在尝试自动化 https://emicalculator.net/ .我尝试了很多方法但没有成功以下是我自动化利率滑块的代码
package seleniumBasics;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class AdjustSliderValue {
static String baseUrl = "https://emicalculator.net/";
public static WebDriver driver;
@BeforeTest
public WebDriver createDriver() {
driver = DriverSetup.getWebDriver();
driver.get(baseUrl);
return driver;
}
@AfterMethod
public void CloseDriver() {
driver.quit();
}
public static int GetPixelsToMove(WebElement Slider,double Amount,double SliderMax,double SliderMin) {
int pixels = 0;
int tempPixels = Slider.getSize().getWidth();
System.out.println(tempPixels);
tempPixels = (int)(tempPixels / (SliderMax - SliderMin));
System.out.println(tempPixels);
tempPixels = (int) (tempPixels * (Amount - SliderMin));
System.out.println(tempPixels);
pixels = tempPixels;
return pixels;
}
@Test
public static void verifySlider() throws InterruptedException {
WebElement Slider = driver.findElement(By.xpath("//*[@id=\"loaninterestslider\"]"));
int PixelsToMove = GetPixelsToMove(Slider,15,20,5);
Actions SliderAction = new Actions(driver);
SliderAction.clickAndHold(Slider).moveByOffset((-(int) Slider.getSize().getWidth() / 2),0)
.moveByOffset(PixelsToMove,0).release().perform();
}
}
我想要一种可以自动化任何滑块的方法。哪位知道的请帮帮我。提前致谢。
解决方法
您也可以尝试使用发送密钥进行关键操作
// Set Loop counter to get desired value
<Your_Slider_Element>.sendKeys(Keys.ARROW_LEFT); // Or ARROW_RIGHT
// End loop
,
dragAndDropBy 通常与滑块一起使用效果最佳。确保您计算像素的方式正确,然后就可以了。
driver.get("https://emicalculator.net/");
WebElement Slider = driver.findElement(By.xpath("//*[@id=\"loaninterestslider\"]"));
int PixelsToMove = GetPixelsToMove(Slider,15,20,5);
Actions move = new Actions(driver);
Action action = (Action) move.dragAndDropBy(Slider,PixelsToMove,0).build();
action.perform();
导入包
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
,
滑块宽度基本上只是此处大小的 100%,但您可以添加任何您想要的像素。
driver.get("https://emicalculator.net/");
WebElement Slider = driver.findElement(By.xpath("//*[@id=\"loaninterestslider\"]"));
Dimension sliderSize = Slider.getSize();
int sliderWidth = sliderSize.getWidth();
int xCoord = Slider.getLocation().getX();
Actions builder = new Actions(driver);
builder.moveToElement(Slider)
.click()
.dragAndDropBy
(Slider,xCoord + sliderWidth,0)
.build()
.perform();
导入
import org.openqa.selenium.Dimension;
import org.openqa.selenium.interactions.Actions;
,
WebDriver driver = new ChromeDriver();
driver.get("https://emicalculator.net/");
WebElement a = driver.findElement(By.cssSelector("#loanamountslider span"));
Actions action = new Actions(driver);
action.clickAndHold(a).moveByOffset(500,0).perform();
在这里,您必须单击滑块元素并拖动它
,正如 topicstarter 正确提到的,问题是关于如何自动化任何滑块。所以让我用请求的解决方案扩展现有的答案。
解决方案并不新鲜 - Selenium 已经有带有 Select 的示例。让我们构建类似的解决方案。
假设我们想要一些类型为 EmiSlider
的对象,以便我们可以这样使用它:
...
EmiSlider slider = new EmiSlider(driver.findElement(By.id("loanamountslider")));
slider.slide(100);
...
我们明确提到了所需的定位器并传递到类 EmiSlider
的构造函数中。 EmiSlider
类将是:
public class EmiSlider {
private final WebElement sliderRoot;
private final WebDriver driver;
public EmiSlider(WebElement slider) {
// Simply store passed root WebElement
this.sliderRoot = slider;
// We require driver instance for internal use so resolve it and store
this.driver = ((WrapsDriver) slider).getWrappedDriver();
}
/**
* Moves slider left or right
* @param x pixels to move slider by. Positive value moves right,negative - left
*/
public void slide(int x) {
// Find the slider WebElement,which is child of root element,using relative search
WebElement sliderElement = this.sliderRoot.findElement(By.cssSelector("span"));
// Perform slide action
new Actions(this.driver)
.clickAndHold(sliderElement)
.moveByOffset(x,0)
.release()
.perform();
}
}
当前的滑块实现有几个缺点:
- 它不依赖当前和极端位置
- 不同的滑块可能有不同的比例(它们确实如此)
- 输入的数量保持不变
希望能补充缺失的功能