Переместить список элементов - Selenium Java WebDriver - PullRequest
0 голосов
/ 20 октября 2018

Ниже приведен сценарий, который я пытаюсь протестировать с помощью 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>

Таким образом, при успешном наведении курс, класс 'hover 'добавляется в 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);
}

Как и прежде, hover, класс' hover 'не являетсядобавлено, список WebElements всегда равен нулю.Пробовал некоторые варианты, предложенные на некоторых сайтах селена, но не работал.Пожалуйста, помогите, как поступить на этом.

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

Проблема с вашим кодом заключается в том, что вы ищете A теги, которые уже имеют класс 'hover' еще до того, как вы наведите курсор мыши.Как вы сказали, класс 'hover' добавляется только до после .Поэтому вам нужно изменить исходный локатор на , а не , включая класс 'hover'.

Я предпочитаю использовать селекторы CSS поверх XPath, если не требуется XPath (поиск элемента по содержащемуся тексту или DOMобход).Вы можете сделать поиск в Google для получения дополнительной информации.Вот проверенный код.

// find all A tags inside the containing DIV
List<WebElement> stars = driver.findElements(By.cssSelector("div.wh-rating-choices-holder > a"));

// loop through each element and hover
Actions action = new Actions(driver);
for (WebElement e : stars)
{
    action.moveToElement(e).perform();
}

// after all the hovering is done, fetch the same elements but expect that they will now contain the 'hover' class
stars = driver.findElements(By.cssSelector("div.wh-rating-choices-holder > a.hover"));

// Assert (TestNG) that there are 5 stars that were hovered
Assert.assertEquals(stars.size(), 5, "Verify 5 elements were hovered");

// click the 5th star
stars.get(4).click();
0 голосов
/ 22 октября 2018

Я только что протестировал решение, но оно очень грубое.Это работает, однако.

Примечание: переход непосредственно к пятой звезде (элемент с текстом «5») не работал для меня.Кажется, вам нужно навести курсор так, чтобы открылось окно держателя рейтинга, а затем навести курсор к пятой звезде, чтобы получить все из них как class = "hover".

Вот что я сделал:

- перейти к элементу выше («Написать отзыв») с помощью действия

- перейти вниз (положительное «y») с шагом 1 пиксель

- после каждогоинкремент, проверьте, содержит ли элемент с классом "wh-rating-choices" строку "block"

- если это так, перейдите к элементу с текстом "5", содержащемуся под элементом с классом "wh-rating"-choices-holder "

Я тестировал его на 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"

0 голосов
/ 20 октября 2018

Кажется, вы были близки.Вам нужно заставить WebDriverWait , чтобы элементы <a> с class="hover" были кликабельными, и вы можете использовать следующее решение:

WebElement rating_holder = driver.findElement(By.xpath("//div[@class='wh-rating-choices']"));
((JavascriptExecutor)driver).executeScript("arguments[0].removeAttribute('style')", rating_holder)
List<WebElement> allStars = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//div[@class='wh-rating-choices']/div[@class='wh-rating-choices-holder']//a")));
System.out.println("<<<<<<<<<<<<------List of all stars, size------------>>>>>>>>>>"+allStars.size());
for (WebElement e : allStars) {
    if(e.getAttribute("innerHTML").contains("5"))
    {
        new Actions(driver).moveToElement(e).build().perform();
        new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='wh-rating-choices-holder']//a[@class='hover']"))).click();
    }
}
...