悬停元素列表-Selenium Java WebDriver

时间:2018-10-20 14:55:56

标签: java selenium selenium-webdriver mousehover

下面是我尝试使用Selenium WebDriver(2.53.1)和Java进行测试的场景。

在网页上,我有一个星星列表。我想将鼠标悬停在它们上面,当我们进行鼠标悬停时,星星会突出显示。然后单击星星之一。当每个星星都悬停时,css会发生变化。

悬停之前

  <div class="wh-rating-choices" style="display: none;">
        <div class="wh-rating-choices-holder">
                                <a href="#">1</a>
                                <a href="#">2</a>
                                <a href="#">3</a>
                                <a href="#">4</a>
                                <a href="#">5</a>
                            <em>Your Rating: <span></span></em>
        </div>
    </div>

悬停后

   <div class="wh-rating-choices" style="display: none;">
        <div class="wh-rating-choices-holder">
                                <a href="#" class="hover">1</a>
                                <a href="#" class="hover">2</a>
                                <a href="#" class="hover">3</a>
                                <a href="#" class="hover">4</a>
                                <a href="#" class="hover">5</a>
                            <em>Your Rating: <span>Excellent</span></em>
        </div>
    </div>

因此,基本上,在成功悬停时,将在html / css中添加“悬停”类。

我尝试过的代码如下。

List<WebElement> allStars = driver.findElements(By.xpath("//a[@class='hover']"));
System.out.println("<<<<<<<<<<<<------List of all stars, size------------>>>>>>>>>>"+allStars.size());
for (WebElement e : allStars) {
    Actions act = new Actions(driver);
    act.moveToElement(e).build().perform();
    Thread.sleep(5000);
}

与悬停之前一样,未添加类“悬停”,WebElement的列表始终为零。尝试了一些硒站点上建议的某些选项,但是没有用。请帮助,如何进行此操作。

3 个答案:

答案 0 :(得分:1)

我刚刚测试了一个解决方案,但是它很粗糙。但是可以。

注意:直接导航至第五颗星(文字为“ 5”的元素)对我不起作用。看来您需要将鼠标悬停以打开“评级持有人”框,然后将鼠标悬停在第五颗星上,以便将它们全部都定为class =“ hover”。

这就是我所做的:

-使用操作导航至上方的元素(“撰写评论”)

-以1个像素的增量向下移动(“ y”为正值)

-每次增加后,测试“ wh-rating-choices”类的元素是否包含字符串“ block”

-如果是的话,移至包含“ wh-rating-choices-holder”类的元素下包含文本“ 5”的元素

我在python中进行了测试,但这是在Java中应该起作用的地方:

Actions action = new Actions(driver);
int inc = 0;
while (inc < 100) {
    WebElement top = driver.findElement(By.xpath("//*[contains(text(), 'Write a Review')]"));
    action.moveToElement(top, 0, inc).contextClick().perform();
    Thread.sleep(200);
    a = driver.findElement(By.xpath("//*[contains(@class, 'wh-rating-choices')]"));
    if (a.getAttribute("style").contains("block") {
        aa = driver.findElement(By.xpath("//*[contains(@class, 'wh-rating-choices-holder')]"));
        bb = aa.findElement(By.xpath(".//*[contains(text(), '5')]"));
        action.moveToElement(bb).perform();
        break;
    }
    inc++;
}
System.out.println(bb.getAttribute("outerHTML"));

Thread.sleep(200)可能会过大,请尝试一些较低的值,例如50或20。

PS。您可能需要先关闭弹出式窗口,该弹出式窗口具有class="af-icon-cross"

答案 1 :(得分:0)

您似乎很近。您需要为<a>的{​​{1}}元素诱导 WebDriverWait ,然后才能使用以下解决方案:

class="hover"

答案 2 :(得分:-2)

您的代码存在的问题是,您甚至在悬停之前正在寻找{'1}}标签,它们已经具有'hover'类。如您所述,在悬停发生后 之前,不会添加“悬停”类。因此,您需要将初始定位器更改为包括“ hover”类。

我更喜欢在XPath上使用CSS选择器,除非需要XPath(通过包含的文本或DOM遍历查找元素)。您可以进行谷歌搜索以获取更多信息。这是经过测试的代码。

A