无法获取 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-save-button\").click()");
这样做可以让我在不可见的情况下点击它。
免责声明: 我意识到这不符合 UI-自动化的精神,因为它不能完全模拟用户的操作,但如果你被卡住了在像我这样 WebDriver 行为不正确的情况下,这个 hack 可能会起作用。
谢谢 kushal 的输入。
我使用 运行 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-save-button\").click()");
这样做可以让我在不可见的情况下点击它。
免责声明: 我意识到这不符合 UI-自动化的精神,因为它不能完全模拟用户的操作,但如果你被卡住了在像我这样 WebDriver 行为不正确的情况下,这个 hack 可能会起作用。
谢谢 kushal 的输入。