WebDriver 拖放在页面上不起作用
WebDriver Drag-and-Drop does not work on the page
我有一个很简单的测试
@Test
void dragAndDrop()
{
driver.get("https://www.testandquiz.com/selenium/testing.html");
driver.manage().window().maximize();
WebElement source = driver.findElement(By.id("sourceImage"));
WebElement target = driver.findElement(By.id("targetDiv"));
builder.dragAndDrop(source, target).perform();
}
测试通过,没有任何异常。但是,它不执行拖放操作。
我试过 Chrome、Firefox 和 Edge。
感谢任何帮助。
which you want to dragAndDrop()
的HTML包含属性draggable=true
可拖动
draggable 是一个属性,指示元素是否可以通过本机浏览器行为或 HTML 拖放 API 拖动。 draggable
可以有以下值:
true
: 元素可以拖动。
false
: 无法拖动元素。
如果没有设置这个属性,它的默认值为auto
,这意味着拖动行为是浏览器的默认行为:只能拖动文本选择、图像和链接。对于其他元素,必须设置事件 ondragstart 才能进行拖放操作。
原生 HTML5 拖放
Eric Bidelman in the article Native HTML5 Drag and Drop 提到,使对象可拖动很简单,因为您只需要在要使其可移动的元素上设置 draggable=true
属性即可。例如:
<div id="cols">
<div class="col" draggable="true"><header>X</header></div>
<div class="col" draggable="true"><header>Y</header></div>
<div class="col" draggable="true"><header>Z</header></div>
</div>
要使其他类型的内容可拖动,您可以利用 HTML5 DnD APIs。但是,使用 CSS3 您可以修饰标记,使其看起来像列,并添加光标为用户提供视觉指示器,表明某些内容是可移动的,但大多数浏览器会创建被拖动内容的幻影并且 可拖动不会做任何事情。一些浏览器,特别是FF会要求在拖动操作中有一些data be sent。
此外,Remy Sharp in the article Dragging Anything提到:
HTML 5 规范说它应该像将以下属性添加到相关元素的标记一样简单:
draggable="true"
但是,这并不完全适用于 Safari 或 Firefox。对于 Safari,您需要向元素添加以下样式:
[draggable=true] {
-khtml-user-drag: element;
}
这将开始在 Safari 中工作,当您拖动时,它将使用 dataTransfer 对象设置一个默认的空值。但是,除非您手动设置一些数据,否则 Firefox 不允许您拖动元素。
在与 HTML5 交互的 Selenium 中存在拖放问题,我尝试在 HTML5 页面上使用以下操作 class 方法,但它们似乎从未起作用
dragAndDrop() | clickAndHold() | moveToElement() | release()
另一方面,您可以使用 JS script
String filePath = "C:\Users\Wilfred\Desktop\drag_and_drop_helper.js";
StringBuffer buffer = new StringBuffer();
String line;
BufferedReader br = new BufferedReader(new FileReader(filePath));
while ((line = br.readLine()) != null)
buffer.append(line);
String javaScript = buffer.toString();
javaScript = javaScript + "$('#sourceImage').simulateDragDrop({ dropTarget: '#targetDiv'});";
((JavascriptExecutor) driver).executeScript(javaScript);
同样的方法不适用于此link and we had to resort to robot class which I wouldn't suggest. You can find more information
我有一个很简单的测试
@Test
void dragAndDrop()
{
driver.get("https://www.testandquiz.com/selenium/testing.html");
driver.manage().window().maximize();
WebElement source = driver.findElement(By.id("sourceImage"));
WebElement target = driver.findElement(By.id("targetDiv"));
builder.dragAndDrop(source, target).perform();
}
测试通过,没有任何异常。但是,它不执行拖放操作。 我试过 Chrome、Firefox 和 Edge。 感谢任何帮助。
dragAndDrop()
的HTML包含属性draggable=true
可拖动
draggable 是一个属性,指示元素是否可以通过本机浏览器行为或 HTML 拖放 API 拖动。 draggable
可以有以下值:
true
: 元素可以拖动。false
: 无法拖动元素。
如果没有设置这个属性,它的默认值为auto
,这意味着拖动行为是浏览器的默认行为:只能拖动文本选择、图像和链接。对于其他元素,必须设置事件 ondragstart 才能进行拖放操作。
原生 HTML5 拖放
Eric Bidelman in the article Native HTML5 Drag and Drop 提到,使对象可拖动很简单,因为您只需要在要使其可移动的元素上设置 draggable=true
属性即可。例如:
<div id="cols">
<div class="col" draggable="true"><header>X</header></div>
<div class="col" draggable="true"><header>Y</header></div>
<div class="col" draggable="true"><header>Z</header></div>
</div>
要使其他类型的内容可拖动,您可以利用 HTML5 DnD APIs。但是,使用 CSS3 您可以修饰标记,使其看起来像列,并添加光标为用户提供视觉指示器,表明某些内容是可移动的,但大多数浏览器会创建被拖动内容的幻影并且 可拖动不会做任何事情。一些浏览器,特别是FF会要求在拖动操作中有一些data be sent。
此外,Remy Sharp in the article Dragging Anything提到:
HTML 5 规范说它应该像将以下属性添加到相关元素的标记一样简单:
draggable="true"
但是,这并不完全适用于 Safari 或 Firefox。对于 Safari,您需要向元素添加以下样式:
[draggable=true] {
-khtml-user-drag: element;
}
这将开始在 Safari 中工作,当您拖动时,它将使用 dataTransfer 对象设置一个默认的空值。但是,除非您手动设置一些数据,否则 Firefox 不允许您拖动元素。
在与 HTML5 交互的 Selenium 中存在拖放问题,我尝试在 HTML5 页面上使用以下操作 class 方法,但它们似乎从未起作用
dragAndDrop() | clickAndHold() | moveToElement() | release()
另一方面,您可以使用 JS script
String filePath = "C:\Users\Wilfred\Desktop\drag_and_drop_helper.js";
StringBuffer buffer = new StringBuffer();
String line;
BufferedReader br = new BufferedReader(new FileReader(filePath));
while ((line = br.readLine()) != null)
buffer.append(line);
String javaScript = buffer.toString();
javaScript = javaScript + "$('#sourceImage').simulateDragDrop({ dropTarget: '#targetDiv'});";
((JavascriptExecutor) driver).executeScript(javaScript);
同样的方法不适用于此link and we had to resort to robot class which I wouldn't suggest. You can find more information