无法获取 Selenium 中的元素(缩放和滚动不起作用)

Can't get to element in Selenium (Zoom and Scroll not working)

我使用 运行 selenium 的网站有一些组件从屏幕上掉下来。我试图向下滚动到它,缩小页面以使其适合等等。它是一个 div 模态框,其中包含一个我需要按下的按钮。

这是我之前的尝试:

1) 滚动到该位置 第一个问题是,每当我尝试在 window 中使用代码或使用我自己的鼠标进行滚动时,所发生的只是模式后面的页面会滚动,而不是模式本身滚动。这仅在 运行 Selenium 时发生。因此,以下代码无效。

JavascriptExecutor js = ((JavascriptExecutor)driver);
js.executeScript("window.scrollTo(0," + driver.findElement(By.xpath("//*[@id=\"manual-order-modal-ignore-validation\"]")).getLocation().x + ")");

它实际上是滚动的,但就像我上面说的,必要的元素永远不会出现在屏幕上。

2) 缩小 #1

我尝试使用 Javascript 缩小完成工作的页面,但它显然放弃了我的 Selenium 驱动程序,因为它试图点击按钮的原始位置并且无法在那里找到它。

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.body.style.zoom='80%'");

同样,我也尝试过使用下面的解决方案,但它也没有用。

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.body.style.transform='scale(0.8)'");

3) 缩小#2

我尝试发送多个击键,但我唯一得到的是一个错误 "cannot focus element"

WebElement html = driver.findElement(By.tagName("html"));
html.sendKeys(Keys.chord(Keys.COMMAND, Keys.SUBTRACT));

4) 缩小 #3

我尝试使用机器人 class 但它根本不滚动,它只是停在那里。

for (int i=0; i< 6; i++)
{
   Robot robot = new Robot();
   robot.keyPress(KeyEvent.VK_CONTROL);
   robot.keyPress(KeyEvent.VK_MINUS);
   robot.keyRelease(KeyEvent.VK_CONTROL);
   robot.keyRelease(KeyEvent.VK_MINUS);
   System.out.println("zoom out")
}

打印了 "zoom out",但未执行任何操作。

如您所见,我查阅并尝试了很多解决方案均无济于事。如果您对如何解决此问题有任何想法,将不胜感激!提前谢谢你。

您可以尝试以下操作:

  WebDriverWait wait = new WebDriverWait(driver,20);
  wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("//*[@id=\"manual-order-modal-ignore-validation\"]"))));

 Actions action = Actions(driver);
 action.moveToElement(driver.findElement(By.xpath("//*[@id=\"manual-order-modal-ignore-validation\"]"))).build().perform();

更新:

JavascriptExecutor js = ((JavascriptExecutor)驱动程序);

js.executeScript("argument[0].click();",driver.findElement(By.id("Your element ID"));

我们可以使用 Sikuli 滚动 too.It 有 3 个滚动功能,这些可能对您有帮助:

screen.wheel(direction, steps);
screen.wheel(target, direction, steps);
screen.wheel(target, direction, steps, stepDelay);

示例:

import org.sikuli.script.Button; 
button = new Button(); 
screen.wheel(RegionForScroll, button.WHEEL_UP, 5);

所以即使我永远无法向下滚动到该按钮,结果你可以通过在 selenium 中执行 Javascript 来单击它。这有点老套,但我的方法是这样的:

((JavascriptExecutor)driver); js.executeScript("document.getElementById(\"manual-order-sav‌​e-button\").click()"‌​);

这样做可以让我在不可见的情况下点击它。

免责声明: 我意识到这不符合 UI-自动化的精神,因为它不能完全模拟用户的操作,但如果你被卡住了在像我这样 WebDriver 行为不正确的情况下,这个 hack 可能会起作用。

谢谢 kushal 的输入。