【问题标题】:Can a scrollIntoView function save its position?scrollIntoView 函数可以保存它的位置吗?
【发布时间】:2017-08-24 05:52:42
【问题描述】:

在执行 selenium webElement.click() 后,我遇到了 JS scrollIntoView 重置的问题。当我在自定义滚动框上使用它时,它会正确执行操作,然后在点击 .click() 后滚动回顶部。

element = driver.findElement(By.xpath("//div[@id='iLegenda']/ul/li[4]/i"));
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", element);
Thread.sleep(500);
driver.findElement(By.xpath("//div[@id='iLegenda']/ul/li[4]/i")).click(); //this line resets the position of the affected scrollbar

另一种解决方案是强制单击该元素,即使它没有显示在屏幕上,但我还没有在这方面找到任何信息......

【问题讨论】:

  • 对您的替代解决方案的建议,$(element).trigger("click") 如果您不能使用 jQuery,您需要将其转换为纯 JavaScript。 api.jquery.com/trigger
  • @lasec0203 试过了,还是会重置。我在这里错过了什么吗? | element = driver.findElement(By.xpath("//div[@id='iLegenda']/ul/li/ul/li[3]/i")); jse.executeScript("arguments[0].scrollIntoView(true);", element); jse.executeScript("arguments[0].click();", element);
  • 您是否尝试在点击后再次将其滚动到视图中
  • 是的,每次点击都会重置。
  • 好吧,如果您必须在 ec2 测试中查看可点击元素,那么看起来您每次点击后都必须调用 scrollintoview

标签: javascript java selenium-webdriver


【解决方案1】:

这不是你可以控制的。这与点击所做的任何事情有关。如果是我,我会把.scrollIntoView() 代码放到一个函数中,这样更容易调用,例如

public void scrollIntoView(WebElement e)
{
    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", e);
}

然后这样称呼它

element = driver.findElement(By.xpath("//div[@id='iLegenda']/ul/li[4]/i"));
scrollIntoView(element);

另外,Thread.Sleep() 是一种不好的做法。 (你可以谷歌了解原因)。无论如何,你不应该在这里等待,但如果你这样做,它应该是这样的

WebDriverWait wait = new WebDriverWait(driver, 2);
WebElement element = driver.findElement(locator);
wait.until(ExpectedConditions.elementToBeClickable(element)).click();

我一直在使用 Java 和 Selenium,而且在单击元素之前我从来不需要滚动。您是否尝试过类似的简单方法

driver.findElement(By.xpath("//div[@id='iLegenda']/ul/li[4]/i")).click();

没有滚动也没有等待?它应该可以工作。

另外,如果你要重复点击同一个元素,你应该这样做

By locator = By.xpath("//div[@id='iLegenda']/ul/li[4]/i");
driver.findElement(locator).click();
// do something
driver.findElement(locator).click();
// ... and so on...

【讨论】:

  • 我已经制作了一个函数/方法/无论它在 java 中调用什么,这只是为了最大限度地减少人们必须通过的代码量。您的“简单”建议是在导出到 java 时创建的原始代码 selenium IDE,它一直有效,直到元素被隐藏。每当发生这种情况时,我都会得到一个 ElementNotIneractableException ,似乎 .findElement().click() 除了查找和单击找到的元素之外没有做任何其他事情。
猜你喜欢
  • 1970-01-01
  • 2012-07-07
  • 2016-07-15
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
相关资源
最近更新 更多