【问题标题】:Drag and Drop not working with chrome webdriver in java拖放不适用于java中的chrome webdriver
【发布时间】:2019-10-02 03:13:27
【问题描述】:

在此处输入图像描述我有以下代码用于将项目从一个位置拖放到另一个位置

By sourceLocatorDragAndDrop = By.cssSelector("#available_objects_parent tbody tr td:eq(4)");

By destinationLocatorDragAndDrop = By.cssSelector("#assigned_objects_parent table tbody");

Actions action = new Actions(webDriver);   

action.dragAndDrop(webDriver.findElement(sourceLocatorDragAndDrop) ,webDriver.findElement(destinationLocatorDragAndDrop)).build().perform();

此代码给出以下错误:

org.openqa.selenium.InvalidSelectorException:无效选择器:一个 指定了无效或非法的选择器(会话信息: chrome=74.0.3729.131)(驱动程序信息:chromedriver=2.46.628402 (536cd7adbad73a3783fdc2cab92ab2ba7ec361e1),平台=Windows NT 10.0.17134 x86_64)(警告:服务器未提供任何堆栈跟踪信息)

谁能告诉我如何解决这个问题?

【问题讨论】:

  • 可以分享HTML代码吗?
  • 如果是弹窗或对话框,请使用 Thread.sleep(millis);对于一小段时间,弹出窗口或对话框需要时间来渲染,这意味着对于 xpath,您从浏览器 id 复制无效,一旦您的对话框或弹出窗口渲染,您的代码将正常工作

标签: java selenium selenium-webdriver css-selectors selenium-chromedriver


【解决方案1】:

对于C#,我根据上面@Pradnya Bolli的帮助使用了这段代码,效果很好:

Actions act = new Actions(Driver);
Actions myDragAndDrop = (Actions)act.ClickAndHold(From).MoveToElement(To).Release(To).Build();
myDragAndDrop.Perform();

【讨论】:

    【解决方案2】:

    我也尝试了不同的选择。 最终这个成功了。 动作动作=新动作(驱动程序); actions.clickAndHold().moveByOffset(0, 100).moveToElement(, 0, 100).release().build().perform(); 线程.sleep(3000);

    添加了睡眠以在开始进一步操作之前等待元素被拖动。

    【讨论】:

      【解决方案3】:

      你也可以使用 JavaScript:-

      因为在 HTML5 中 Action draganddrop 函数不起作用,我使用 javascript 并且它对我来说工作正常:-

          WebElement From = driver.findElement(By.id("sourceImage"));
          WebElement To = driver.findElement(By.id("targetDiv"));
      
          //HTML 5 
          final String java_script =
                  "var src=arguments[0],tgt=arguments[1];var dataTransfer={dropEffe" +
                  "ct:'',effectAllowed:'all',files:[],items:{},types:[],setData:fun" +
                  "ction(format,data){this.items[format]=data;this.types.append(for" +
                  "mat);},getData:function(format){return this.items[format];},clea" +
                  "rData:function(format){}};var emit=function(event,target){var ev" +
                  "t=document.createEvent('Event');evt.initEvent(event,true,false);" +
                  "evt.dataTransfer=dataTransfer;target.dispatchEvent(evt);};emit('" +
                  "dragstart',src);emit('dragenter',tgt);emit('dragover',tgt);emit(" +
                  "'drop',tgt);emit('dragend',src);";
      
          ((JavascriptExecutor)driver).executeScript(java_script, From, To);
      

      使用Actions 代码如下:-

      WebElement From = driver.findElement(By.id("sourceImage"));
      WebElement To = driver.findElement(By.id("targetDiv"));
      
      Actions builder = new Actions(driver);
      Action dragAnddrop = builder.clickAndHold(From)
                              .moveToElement(To)
                              .release(To)
                              .build();
      dragAnddrop.perform();
      

      使用 firefox IDE 查找 xpath。 欲了解更多信息,请访问this 链接。

      【讨论】:

      • 我在 Actions 的第二个 sn-p 中收到以下错误。任何线索为什么会发生这种情况.. org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (472, 9041)
      • 因为元素不可见,或者页面在单击元素之前刷新,或者元素是可点击的,但上面有一个微调器/叠加层......通过此链接stackoverflow.com/a/19763087/4513879
      • 这很棒 - 我使用的是您使用 JavaScriptExecutor 的 JavaScript 解决方案。我在 C# 中使用 Selenium 而不是 Java,但它几乎相同。一个更正虽然 - 在 JS 中, this.types.append 实际上应该是 this.types.push (因为 this.types 是 JS 中的一个数组,所以应该使用推送)
      【解决方案4】:

      :eq() 是一个 JQuery 选择器,而不是 cssselector。 Selenium 无法识别它。最接近的匹配是:nth-child()

      By sourceLocatorDragAndDrop = By.cssSelector("#available_objects_parent tbody tr td:nth-child(4)");
      

      【讨论】:

        【解决方案5】:

        您似乎使用了错误的 cssSelector。您始终可以在 chrome 开发人员选项中验证 xpath。请通过以下链接。请提供 sourceLocatorDragAndDrop 和 destinationLocatorDragAndDrop 的 html 代码,以便我们了解问题所在。

        https://yizeng.me/2014/03/23/evaluate-and-validate-xpath-css-selectors-in-chrome-developer-tools/

        【讨论】:

        • 这应该更像是一个评论。
        • 对不起,我没有评论的特权,因为我是一个新的贡献者。所以我提出了验证 cssselector 的建议。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-24
        相关资源
        最近更新 更多