Есть ли способ перетащить элемент из одного кадра в другой? - PullRequest
0 голосов
/ 30 декабря 2018

Надеюсь, у вас все хорошо,

Я пытаюсь перетащить и добавить элемент из FrameOne в FrameTwo, но не могу этого сделать. Пожалуйста, помогите мне понять концепцию и то, что я делаю неправильно, и мне нужночтобы выполнить задачу, используя только класс Actions.

Вот URL-адреса:

  1. https://www.w3schools.com/html/html5_draganddrop.asp

Здесь элемент находится в divblock Я могу получить все локаторы и выполнить все другие действия, используя класс Actions, но не могу перетащить элемент.

2. https://codepen.io/rjsmer/full/vvewWp

Здесь я пытаюсьпереместить элемент из первого кадра во второй, но я не могу этого сделать.

Я пробовал методы drangAndDrop (), ClickAndHold (), искал так много решений, смотрю видео на одном и том же сбезуспешно.

package DragAndDropPracticeFrame;

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;

import static io.github.bonigarcia.wdm.DriverManagerType.CHROME;

public class DragDropFrame {
    public static void main(String[] args) throws InterruptedException {
    WebDriverManager.getInstance(CHROME).setup();
    WebDriver driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.get("https://codepen.io/rjsmer/full/vvewWp");
    driver.switchTo().frame("result");
    System.out.println("Inside First Frame.");
    WebElement frameOne =         
    driver.findElement(By.cssSelector("iframe.dragFrame.dragDrop"));
    driver.switchTo().frame(frameOne);
    System.out.println("Inside Frame 3");
    WebElement elementOne = driver.findElement(By.id("dragFrame-0"));
    System.out.println("First element found: " + elementOne.getText());
    Actions builder = new Actions(driver);
    driver.switchTo().defaultContent();
    System.out.println("Inside main page");
    driver.switchTo().frame("result");
    //System.out.println("Switched to Frame First");
    WebElement frameThree = 
    driver.findElement(By.xpath("//iframe[@class='dropFrame dragDrop']"));
    Action action =
    builder.clickAndHold(elementOne)
    .moveToElement(frameThree)
    .release(frameThree).build();

    //driver.switchTo().frame(frameTwo);
    //System.out.println("Switched to frame 3");
    action.perform();

    //driver.switchTo().defaultContent();
    //builder.perform();

}
}

Еще одна попытка:

    WebDriverManager.getInstance(CHROME).setup();
        WebDriver driver = new ChromeDriver();
        driver.get("https://codepen.io/rjsmer/full/vvewWp");
        driver.switchTo().frame(0);
        WebElement frameOne = driver.findElement(By.xpath("//iframe[@class='dragFrame dragDrop']"));
        WebElement frameTwo = driver.findElement(By.xpath("//iframe[@class='dropFrame dragDrop']"));
        driver.switchTo().frame(frameOne);
// identify element in first frame
        WebElement elementOne = driver.findElement(By.id("dragFrame-0"));

// Use Actions class for tap and hold
        Actions actions = new Actions(driver);
        Actions action = actions.clickAndHold(elementOne);
        actions.build();
        action.perform();

// switch to the second frame
        driver.switchTo().frame(frameTwo);

// move element to another frame
        WebElement elementTwo = driver.findElement(By.xpath("//body[@class='frameBody dropFrameBody']"));
        Actions actions2 = new Actions(driver);
        Actions action2 = actions2.moveToElement(elementTwo);
        actions2.release(elementOne);
        actions2.build();
        action2.perform();

Ожидается: элемент должен переместиться в кадр 3 Фактическое: ничего не произошло.

Ответы [ 3 ]

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

Я заметил, что при запуске кода выше, если вы двигаете мышь, вы можете видеть перетаскиваемый элемент, прикрепленный к мыши.Попробуйте использовать библиотеку роботов и выполните это с помощью действий мыши из библиотеки роботов.См. https://www.guru99.com/using-robot-api-selenium.html

Я не могу проверить это на своем конце, так как в библиотеке робота есть ошибка на Mac, и я использую Mac, если вы используете Windows, вы можете попробовать:

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

После многих трейлов, использующих класс Actions, я понял, что класс Actions не может использоваться для перетаскивания элементов между кадрами.Итак, я перешел на использование Robot Class , и это сработало!

//Setting up chrome driver
WebDriverManager.getInstance(CHROME).setup();
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();

//Redirecting to the website
driver.get("https://codepen.io/rjsmer/full/vvewWp");

Robot robot = new Robot();
robot.mouseMove(120, 300);
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);

Thread.sleep(2000);
robot.mouseMove(500, 320);

Thread.sleep(2000);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);

Сны здесь важны, так как команды выполняются быстро, и это помогает классу роботов точно расставлять свои команды.

В зависимости от dragFrame, который вы хотите перетащить, вы можете использовать соответствующие координаты.

0 голосов
/ 31 декабря 2018

Что, если сначала вы идентифицируете первый кадр и используете класс Actions.Там вы можете сделать, нажмите и удерживайте.Затем переключитесь на другой фрейм и используйте перемещение к элементу.

// move to first frame
driver.switchTo().frame("frameOne");

// identify element in first frame
WebElement elementOne = driver.findElement(By.xpath(XPATH));

// Use Actions class for tap and hold
Actions actions = new Actions(driver);
Actions action = actions.clickAndHold(elementOne);
actions.build();
action.perform();

// switch to the second frame
driver.switchTo().frame("frameTwo");

// move element to another frame
Actions actions2 = new Actions(driver);
Actions action2 = actions2.moveToElement(elementTwo);
actions2.release(elementTwo);
actions2.build();
action2.perform();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...