有什么方法可以解决对Web元素排序的问题?使用拖放功能排序时遇到困难

时间:2018-12-31 16:47:28

标签: java eclipse selenium-webdriver

有什么办法可以解决对Web元素的排序?使用拖放功能进行排序时遇到困难。我的拖放操作不起作用,我认为我的逻辑很好,但是在运行代码时什么也没发生...

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 :(得分:3)

以@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;
        });
  }
}

答案 1 :(得分:0)

这是一个有趣的小练习...

您应该使用已建立的排序算法,而不是尝试发明自己的排序代码。我选择了冒泡排序,但是您可以选择任何一个。如果您只排序一些项目,则应该可以正常工作。它只需几秒钟即可运行。

主要代码

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交换。