滚动到 Web 驱动程序中 bootstrap 模式中的元素不起作用
Scrolling to a element in bootstrap modal in web driver is not working
我正在尝试通过 Web 驱动程序关闭 bootstrap 模式 script.The 模式在 bottom.I 处有关闭按钮 我正在尝试滚动到该元素然后单击该元素但是它不是 working.when 使用的 moveToELement(toElement)
脚本抛出的方法
MoveTargetOutOfBoundsException: Offset within element cannot be
scrolled into view:" exception
。所以我尝试了 javascript 滚动方法,另一个 way.They 没有抛出任何异常,但它也没有用。下面是代码
WebDriver d=new FirefoxDriver();
d.get("http://getbootstrap.com/javascript/");
d.findElement(By.linkText("Modal")).click();
d.findElement(By.cssSelector("button[data-target='#myModal']")).click();
WebElement e=d.findElement(By.className("btn-default"));
//using moveToElement
Actions a=new Actions(d);
a.moveToElement(e).click().build().perform();
//using js scroll
JavascriptExecutor js=(JavascriptExecutor)d;
Point p=e.getLocation();
int y=p.getY();
int x=p.getX();
js.executeScript("scroll("+x+","+y+")");
e,click();
//another way
Coordinates coordinate = ((Locatable)e).getCoordinates();
coordinate.onPage();
coordinate.inViewPort();
e.click();
关于如何解决的任何建议 this.Thanks 提前
它不起作用的原因是您的元素 Close
在模态对话框下。所以你的 className 不会起作用,因为在模式对话框和 html 中有多个元素使用 class。尝试使用 xpath 作为:
.//*[@id='myModal']//button[text()='Close']
如果你也想进行滚动,可以通过以下代码实现:
((JavascriptExecutor) d).executeScript("window.scrollBy(" + x + ","
+ y + ")", "");
其中 x 和 y 是通过给定 xpath 找到的元素的坐标。使用给定的 xpath 你只需要找到那个元素并执行 element.click()
.
以下是您的代码无法运行的原因:
- 您没有添加超时代码(Implicit/Explicit),这有时可能会导致与找不到元素相关的异常。
- 最后,class-名称,您试图通过该名称找到 'Close' 按钮,即实际上 返回13 个不同的元素(使用 Firepath 检查时)。
下面的代码解决了上述所有问题并且也有效:
WebDriver d=new FirefoxDriver();
d.manage().window().maximize();//Maximizing window
d.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);//Giving implicit timeout of 20 seconds
//Navigating to the site
d.get("http://getbootstrap.com/javascript/");
//Clicking on the "Modal" Link text
d.findElement(By.linkText("Modal")).click();
//Clicking on the "Launch Demo modal" button
d.findElement(By.cssSelector("button[data-target='#myModal']")).click();
//Clicking on the Close button of opened Modal window
d.findElement(By.xpath("//div[@id='myModal']//button[.='Close']")).click();
我正在尝试通过 Web 驱动程序关闭 bootstrap 模式 script.The 模式在 bottom.I 处有关闭按钮 我正在尝试滚动到该元素然后单击该元素但是它不是 working.when 使用的 moveToELement(toElement)
脚本抛出的方法
MoveTargetOutOfBoundsException: Offset within element cannot be scrolled into view:" exception
。所以我尝试了 javascript 滚动方法,另一个 way.They 没有抛出任何异常,但它也没有用。下面是代码
WebDriver d=new FirefoxDriver();
d.get("http://getbootstrap.com/javascript/");
d.findElement(By.linkText("Modal")).click();
d.findElement(By.cssSelector("button[data-target='#myModal']")).click();
WebElement e=d.findElement(By.className("btn-default"));
//using moveToElement
Actions a=new Actions(d);
a.moveToElement(e).click().build().perform();
//using js scroll
JavascriptExecutor js=(JavascriptExecutor)d;
Point p=e.getLocation();
int y=p.getY();
int x=p.getX();
js.executeScript("scroll("+x+","+y+")");
e,click();
//another way
Coordinates coordinate = ((Locatable)e).getCoordinates();
coordinate.onPage();
coordinate.inViewPort();
e.click();
关于如何解决的任何建议 this.Thanks 提前
它不起作用的原因是您的元素 Close
在模态对话框下。所以你的 className 不会起作用,因为在模式对话框和 html 中有多个元素使用 class。尝试使用 xpath 作为:
.//*[@id='myModal']//button[text()='Close']
如果你也想进行滚动,可以通过以下代码实现:
((JavascriptExecutor) d).executeScript("window.scrollBy(" + x + ","
+ y + ")", "");
其中 x 和 y 是通过给定 xpath 找到的元素的坐标。使用给定的 xpath 你只需要找到那个元素并执行 element.click()
.
以下是您的代码无法运行的原因:
- 您没有添加超时代码(Implicit/Explicit),这有时可能会导致与找不到元素相关的异常。
- 最后,class-名称,您试图通过该名称找到 'Close' 按钮,即实际上 返回13 个不同的元素(使用 Firepath 检查时)。
下面的代码解决了上述所有问题并且也有效:
WebDriver d=new FirefoxDriver();
d.manage().window().maximize();//Maximizing window
d.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);//Giving implicit timeout of 20 seconds
//Navigating to the site
d.get("http://getbootstrap.com/javascript/");
//Clicking on the "Modal" Link text
d.findElement(By.linkText("Modal")).click();
//Clicking on the "Launch Demo modal" button
d.findElement(By.cssSelector("button[data-target='#myModal']")).click();
//Clicking on the Close button of opened Modal window
d.findElement(By.xpath("//div[@id='myModal']//button[.='Close']")).click();