【问题标题】:Clicking specific part of element using Selenium使用 Selenium 单击元素的特定部分
【发布时间】:2014-11-19 02:09:18
【问题描述】:

我正在尝试单击元素的特定部分,因为站点必须使用一些 JS 魔法来检测我单击的元素中的位置。我不能只点击行,它必须在黑色小三角形上。

我尝试点击跨度中包含的文本:

我还尝试单击包含作为背景一部分的三角形的整个背景 div:

我使用了多种点击坐标和相对于跨度移动光标的组合,如下所示:

WebElement we = driver.findElement(By.xpath("//span[contains(string(),'Remote PC')]"));
Actions clickTriangle= new Actions(driver);
clickTriangle.moveToElement(we).moveByOffset(-10, -5).click().perform();

我应该如何点击这个小三角形?

编辑

根据要求提供更多 HTML:

在这里你可以看到三角形被指定为 div 的背景:

【问题讨论】:

  • 您是否尝试过对 div 元素进行偏移?
  • 我没有,但我想我可以。让我试试。
  • 我似乎也不太幸运。我尝试了各种像素偏移来“探索”该区域。
  • 点击动作是关联span还是div?我猜它的跨度就是你点击它的原因。
  • 我只是尝试使用跨度作为参考点,然后稍微向左移动并单击三角形。我也尝试过使用 div,当你移动到一个元素时,它会移动到左上角,然后从那里向下和向右移动。运气也不好。

标签: java selenium webdriver


【解决方案1】:

你可以试试这个,

WebDriverWait wait = new WebDriverWait(driver, 300);
Actions builder = new Actions(driver);
WebElement element = wait.until(ExpectedConditions
            .elementToBeClickable(By.id("node_0_item")));
Action action = builder.moveToElement(element, 24, 0).click().build();
action.perform();

来自 Java 文档 herexOffset - Offset from the top-left corner. A negative value means coordinates right from the element.

我们要移动到 div 元素的左边,所以我们需要提供正值。我选择了 24 像素,因为在我看来,该 div 在该图像的右侧 24 像素。如果上述方法不起作用,请为 xOffset 尝试一些不同的值。希望对你有用。

编辑#添加 WebDriverWait

【讨论】:

  • 我收到了org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up action.perform();
  • 我添加了 WebDriverWait 并更新了答案。你可以试一试吗?
  • 明天我才能试用,但我会先试一试。
  • 这非常接近。以前单击似乎什么也没做,但现在该行突出显示黄色。当您单击背景上的某个位置而不是三角形时,就会发生这种情况。让我尝试一些不同的坐标,看看是否只是击中正确位置的情况。
  • 酷。我认为您只需要使用 xOffset 即可。也尝试调整 yOffset,但不是很多,因为三角形的高度很小
【解决方案2】:

您需要使用JavascriptExecutor 来单击不是链接或按钮的元素。所以尝试类似

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.querySelector(\"a[id$='node_0_item'] span\").click()");

【讨论】:

  • 虽然 jsexecutor 可以工作,但不推荐使用它,因为它不能模拟真实的用户操作,并且可以掩盖应用程序中可能存在的问题。仅将其用作最后的手段。
  • 我觉得还是比弄乱偏移要好,这也很容易出错
【解决方案3】:

这里是moveToElement方法的描述:

/**

  • 将鼠标移动到元素左上角的偏移处。
  • 元素滚动到视图中,并使用 getBoundingClientRect 计算其位置。
  • @param toElement 要移动到的元素。
  • @param xOffset 从左上角偏移。负值表示坐标离开
  • 元素。
  • @param yOffset 从左上角偏移。负值表示上面的坐标
  • 元素。
  • @return 一个自引用。

    */

因此,如果您尝试从元素向左单击,那么您必须为 xOffset 提供负值。自从 nilesh 发表评论后,Java 文档可能发生了变化。

我发现通过 org.openqa.selenium.StaleElementReferenceException 异常的唯一解决方案是我将元素的搜索和对它的操作都放在 try-catch 中我在 do-while 循环中重复执行的块,直到我不再有异常,或者直到它执行了有限的重试以逃避无限循环的可能性。 如果页面在您找到元素后发生更改,直到您对其执行操作,则会引发此异常。

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    相关资源
    最近更新 更多