【问题标题】:Set value for slider with Selenium WebDriver使用 Selenium WebDriver 设置滑块的值
【发布时间】:2016-11-11 14:18:16
【问题描述】:

我有一个这样的滑块:

由angular-js编写,代码如下:

<div class="ng-isolate-scope" data-range-slider-directive="" data-model="dataModel" data-model-property="surroundingEvnt" data-floor-value="0" data-ceil-value="10" data-max-value-plus="true">
    <div class="rzslider ng-isolate-scope" data-rz-slider-model="model[modelProperty]" data-rz-slider-options="slider.options">
        <span class="rz-bar-wrapper">
        <span class="rz-pointer rz-pointer-min" ng-style="minPointerStyle" role="slider" aria-valuenow="0" aria-valuetext="0" aria-valuemin="0" aria-valuemax="10" tabindex="0" style="left: 0px;"></span>
        // a lot of spans here            
    </div>
</div>

这是插件:https://github.com/angular-slider/angularjs-slider

我想单击以将滑块点滑动到值,例如 4 或 6。但我不知道如何移动滑块。任何人都可以有任何建议。我的测试是用 Java 编写的。谢谢

【问题讨论】:

  • 你可以尝试使用ActionChains模块中的drag-and-drop by offset方法

标签: angularjs selenium selenium-webdriver slider automated-tests


【解决方案1】:

你没有指定你想要的语言,所以我用 Java 编写了一些代码,希望你可以使用或适应。这个概念是获取滑块的容器元素,然后根据宽度的比例因子单击(一次)元素以获得所需的值。

我在 this page 上找到了一个示例 angular.js 滑块,我用它来编写此代码并且它正在工作。首先我们有一个函数,它接受要设置的值和滑块的WebElement。该函数使用滑块元素的宽度和滑块的最小值/最大值来确定比例并单击正确的偏移量来设置正确的值。

/**
 * Sets the value on a horizontal angular.js slider
 * 
 * @param value
 *            the desired value
 */
public static void setHValue(WebElement slider, double value)
{
    double minValue = Double.parseDouble(slider.getAttribute("min"));
    double maxValue = Double.parseDouble(slider.getAttribute("max"));
    int sliderH = slider.getSize().height;
    int sliderW = slider.getSize().width;
    System.out.println(sliderH);
    System.out.println(sliderW);
    Actions action = new Actions(driver);
    action.moveToElement(slider, (int) (value * sliderW / (maxValue - minValue)), sliderH / 2).click().build().perform();
}

调用它看起来像这样。

driver.get("https://material.angularjs.org/latest/demo/slider");
WebElement slider = driver.findElement(By.id("red-slider"));
setHValue(slider, 150);

此滑块的值范围为 0-255,因此要获得所需的值 150,我们从元素本身获取最小值和最大值,然后根据元素的宽度确定宽度的比例因子以确定宽度偏移。高度偏移只是元素高度的一半,假设滑块位于元素的中间。之后剩下的就是使用Actions.moveToElement(toElement, xOffset, yOffset)方法并点击正确的位置。

【讨论】:

  • 嗨@JeffC,感谢您提供详细的答案。我用 Java 编写测试。我使用你的答案,但没有成功。与您的代码和材料页面一样,滑块是一个元素 ,但在我的情况下,滑块位于 data-floor-value="0", data 的 div 中-ceil-value="10",滑块点是一个跨度,role="slider"、aria-valuemin="0"、aria-valuemax="10",就像我的问题一样。我修改了你的代码,一切都很好,我得到的最小值和最大值分别是 0 和 10,但我总是在 moveToElement 得到 InvocationTargetException。
  • 看不到页面就很难测试。您可以链接页面或至少在角度演示页面上找到相同或相似的示例滑块吗?一旦你传入包含data-floor-valuedata-ceil-valuediv 并更新minValuemaxValue 以提取这些属性而不是minmax,你应该很好。不用担心单击滑块本身(嵌套元素之一),只需单击其中一个容器……您只需通过反复试验找到正确的。
  • 感谢 JeffC。我刚刚问了 geckodriver 的人(我正在使用 geckodriver 和 FF 49.0.2),结果发现 Selenium Actions API 还没有在 geckodriver 中实现!这就是您的代码和我的改编不起作用的原因。因此,我将尝试使用 Chrome 或尝试考虑另一种解决方法。感谢您的帮助。
猜你喜欢
  • 2016-02-11
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
相关资源
最近更新 更多