微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Selenium Java 中自动化滑块

如何解决如何在 Selenium Java 中自动化滑块

嗨,我正在尝试自动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();
    }
}

当前的滑块实现有几个缺点:

  • 它不依赖当前和极端位置
  • 不同的滑块可能有不同的比例(它们确实如此)
  • 输入的数量保持不变

希望能补充缺失的功能

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。