WebDriverException:未知错误:元素在点上无法点击

时间:2015-09-17 10:57:27

标签: google-chrome selenium-webdriver

使用WebDriver在Chrome上执行操作

我有一个扩展名为.xqy的网页。我在哪里执行一些动作并打开第一帧。然后在第一帧上执行一些操作后,打开第二帧,然后打开第三帧。 现在,我需要在第一帧上执行某些操作,以便关闭当前使用selenium焦点的第三帧,然后使用以下代码关闭第二帧:

WebDriver dObjExit = driverObj.switchTo().frame(driverObj.findElement(By.xpath("html/body/div[4]/iframe"))).switchTo().frame(driverObj.findElement(By.xpath("//body[@class='dlg-page']/div[4]/iframe")));
dObjExit.findElement(By.xpath("//p[@class='modal-footer']/button")).click();

现在,我刚刚离开了第一帧,并使用以下代码点击其上的元素:

WebDriver dObjExit1 = driverObj.switchTo().parentFrame();
ObjExit1.findElement(By.xpath("//button[@id='srch-save']")).click();

但是Selenium会抛出以下错误:

  

线程“main”中的异常org.openqa.selenium.WebDriverException:   未知错误:元素在点(54,88)处不可点击。其他   元素将收到点击:

关于决议的任何想法?也尝试使用Actions类但无济于事。

2 个答案:

答案 0 :(得分:5)

使用JavascriptExecutor克服此问题: -

WebElement element= driver.findElement(By.xpath("YOUR XPATH"));

JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", element);

答案 1 :(得分:1)

您可以在出错之前编写2个方法,等待页面加载并执行所有ajax,例如:

    public static void waitForPageLoaded() {
    ExpectedCondition<Boolean> expectationLoad = new
            ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver driver) {
                    return ((JavascriptExecutor) driver).executeScript("return document.readyState").toString().equals("complete");
                }
            };
    try {
        Thread.sleep(250);
        WebDriverWait waitForLoad = new WebDriverWait(driver, 33);
        waitForLoad.until(expectationLoad);
    } catch (Throwable error) {
        Assert.fail("Timeout waiting for Page Load Request to complete.");
    }
}

public static void waitForAjaxFinished() {
    ExpectedCondition<Boolean> expectationAjax = new
            ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver driver) {
                    return ((Boolean)((JavascriptExecutor)driver).executeScript("return jQuery.active == 0"));
                }
            };
    try {
        Thread.sleep(250);
        WebDriverWait waitForAjax = new WebDriverWait(driver, 33);
        waitForAjax.until(expectationAjax);
    } catch (Throwable error) {
        Assert.fail("Timeout waiting for Ajax Finished to complete.");
    }
}