Есть ли способ решить сортировку веб-элемента?У меня возникают трудности при сортировке с использованием функции перетаскивания - PullRequest
0 голосов
/ 31 декабря 2018

Есть ли способ решить сортировку веб-элемента?У меня возникают трудности при сортировке с использованием функции перетаскивания.Мое перетаскивание не работает, я думаю, что моя логика хороша, но во время выполнения кода ничего не происходит ...

public void sortable() { // loop for drag and drop is not working...
    try {
        driver.get("http://jqueryui.com/");
        myLibrary.clickButton(By.partialLinkText("Sortable"));          

        WebElement iframe = driver.findElement(By.xpath("//*[@id='content']/iframe"));
        driver.switchTo().frame(iframe);            
        String temp = "";

        Thread.sleep(10 * 1000); //manual work to disorder sortable list prior to start for loop.
        Actions action = new Actions(driver);
        int i = 1, j = 1;

        for (i = 1; i < 8; i = i + 1) {
            WebElement sourceText = driver.findElement(By.cssSelector("#sortable > li:nth-child(" + i + ")")); 

            WebElement dragElement = driver
                    .findElement(By.cssSelector("#sortable > li:nth-child(" + i + ") > span"));
            while (true) {
                temp = "Item" + " " + j;
                if (temp == sourceText.getText()) {
                    WebElement targetElement = driver
                            .findElement(By.cssSelector("#sortable > li:nth-child(" + j + ")"));
                    action.moveToElement(dragElement).dragAndDrop(dragElement, targetElement).build().perform();
                    Thread.sleep(1 * 1000);
                    break;
                } else {

                    if (j == 8) {
                        break;
                    } else {
                        j++;
                    }
                }

            }

        }

        Thread.sleep(5 * 1000);

    } catch (Exception e) {
        e.printStackTrace();
    }

}

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Основываясь на том, что @JeffC опубликовал в качестве ответа, вот еще один вариант того же, который использует некоторые из встроенных возможностей Java.

Мы в основном используем List.sort() и Comparator, чтобы получитьэто сделано.

import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class SorterSample {
  private RemoteWebDriver driver;

  @BeforeClass
  public void setup() {
    driver = new ChromeDriver();
  }

  @AfterClass
  public void cleanup() {
    if (driver != null) {
      driver.quit();
    }
  }

  @Test
  public void testMethod() {
    String url = "http://jqueryui.com/sortable/";
    driver.get(url);
    driver.switchTo().frame(driver.findElement(By.cssSelector("iframe.demo-frame")));
    List<WebElement> items = driver.findElements(By.cssSelector("#sortable > li"));
    items.sort(
        (o1, o2) -> {
          int compareValue = o1.getText().compareTo(o2.getText());
          if (compareValue < 0) {
            new Actions(driver).dragAndDrop(o1, o2).perform();
          }
          return compareValue;
        });
  }
}
0 голосов
/ 31 декабря 2018

Это было забавное маленькое упражнение ...

Вместо того, чтобы пытаться придумать свой собственный код сортировки, вы должны использовать установленный алгоритм сортировки.Я выбрал пузырьковую сортировку, но вы можете выбрать любую, какую захотите.Если вы просто сортируете несколько элементов, это должно работать нормально.Он запускается всего за несколько секунд.

Основной код

String url = "http://jqueryui.com/sortable/";
driver.get(url);
driver.switchTo().frame(driver.findElement(By.cssSelector("iframe.demo-frame")));
List<WebElement> items = driver.findElements(By.cssSelector("#sortable > li"));
bubbleSort(items);

Метод пузырьковой сортировки

static void bubbleSort(List<WebElement> items)
{
    int n = items.size();
    boolean swapped;
    for (int i = 0; i < n - 1; i++)
    {
        swapped = false;
        for (int j = 0; j < n - i - 1; j++)
        {
            int compare = items.get(j).getText().compareTo(items.get(j + 1).getText());
            if (compare < 0)
            {
                swap(items.get(j + 1), items.get(j));
                swapped = true;
            }
        }

        // break if no elements were swapped
        if (swapped == false)
        {
            break;
        }
    }
}

и, наконец, метод поддержки для обмена элементами

public static void swap(WebElement source, WebElement target)
{
    new Actions(driver).dragAndDrop(source, target).perform();
}

Я просто запускал этот код несколько раз, и он работает просто отлично.Он сортирует элементы в обратном порядке (поэтому вам не нужно смешивать их вручную).Это не самый эффективный способ сделать это, но я хотел иметь возможность наблюдать за работой пузырьковой сортировки, чтобы вы могли видеть каждый обмен.Если вы хотите, чтобы это происходило быстрее, вы можете извлечь текст из элементов, отсортировать этот список, а затем выровнять элементы по их отсортированному тексту, так что вам нужно только сделать n swaps.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...