Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';无法进入Selenium中的元素(缩放和滚动不工作)_Java_Selenium_Automation_Ui Automation - Fatal编程技术网

Java Can';无法进入Selenium中的元素(缩放和滚动不工作)

Java Can';无法进入Selenium中的元素(缩放和滚动不工作),java,selenium,automation,ui-automation,Java,Selenium,Automation,Ui Automation,我正在运行selenium的网站上有一些组件从屏幕上脱落。我试着向下滚动到它,缩小页面使其适合,等等。它是一个div模式,包含一个我需要按下的按钮 以下是我以前的尝试: 1) 滚动到该位置 第一个问题是,每当我尝试滚动,使用代码或在窗口中使用自己的鼠标时,都会发生模态后面的页面滚动而不是模态本身滚动的情况。这仅在运行Selenium时发生。因此,下面的代码不起作用 JavascriptExecutor js = ((JavascriptExecutor)driver); js.executeSc

我正在运行selenium的网站上有一些组件从屏幕上脱落。我试着向下滚动到它,缩小页面使其适合,等等。它是一个div模式,包含一个我需要按下的按钮

以下是我以前的尝试:

1) 滚动到该位置 第一个问题是,每当我尝试滚动,使用代码或在窗口中使用自己的鼠标时,都会发生模态后面的页面滚动而不是模态本身滚动的情况。这仅在运行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

我尝试发送多个按键,但唯一得到的是一个错误,上面写着“无法聚焦元素”

4) 缩小#3

我试着使用robot类,但它根本没有滚动,只是放在那里

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")
}
for(int i=0;i<6;i++)
{
机器人=新机器人();
机器人按键(KeyEvent.VK_控制);
robot.keyPress(KeyEvent.VK_减号);
robot.keyRelease(KeyEvent.VK_控制);
robot.keyRelease(KeyEvent.VK_减号);
System.out.println(“缩小”)
}
将打印“缩小”,但不执行任何操作

正如你所看到的,我查了一下,尝试了很多解决方案,但都没有效果。如果您对如何解决这个问题有任何想法,我们将不胜感激!提前谢谢。

您可以尝试以下内容:

  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(“参数[0]。单击();”,driver.findElement(By.id(“您的元素id”));

我们也可以使用Sikuli滚动。它有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)驱动程序);
js.executeScript(“document.getElementById(\”手动订单sav‌​电子按钮\')。单击()‌​);

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

免责声明:我意识到这不符合UI自动化的精神,因为它不完全模拟用户的行为,但如果您陷入像我这样的WebDriver行为不正确的情况,这种黑客可能会奏效


谢谢kushal的输入。

这不起作用,因为按钮从未出现在屏幕上,所以我得到的只是ElementNotVisibleException。我首先需要一种方法将元素先放到屏幕上,然后才能单击它。元素在DOM上存在;所以使用显式等待,直到该项变为可见;尝试我的更新答案。问题是我无法滚动到元素,因此无论我等待多长时间,它都会超时并出错。本质上,元素是在DOM中加载的,但在屏幕外加载。我需要一种方法在屏幕外访问它或将它放到我的屏幕上。如果你只想单击按钮,可以使用JavascriptExecutor执行;检查我更新的回答好吗最终使用了类似的方法,但与您的方法不同。我使用了
JavascriptExecutor js=((JavascriptExecutor)驱动程序);js.executeScript(“document.getElementById(\“manual order save button\”)。click()
非常感谢kushal!你知道我在哪里可以得到maven依赖项吗?我在google上尝试的所有东西都会导致导入语句的sikuli部分高亮显示为红色。您好,我已经从网站下载了Sikulixsetup-1.1.0.jar,并单击该jar进行安装。安装后,添加了sikulixapi.jar作为externBuildpath中的al jar。我没有尝试使用Maven dependecy,但是我在中找到了下面的dependency,试试这个。
org.sikuli-sikuli-core 1.0.0
import org.sikuli.script.Button; 
button = new Button(); 
screen.wheel(RegionForScroll, button.WHEEL_UP, 5);