1

我正在为网页编写一个自动化测试用例。这是我的场景。我必须在 html 表单中单击并键入各种 Web 元素。但是,有时在文本字段上键入时,会出现一个 ajax 加载图像,模糊了我想要与之交互的所有元素。所以,我在点击下面的实际元素之前使用网络驱动程序等待,

WebdriverWait innerwait=new WebDriverWait(driver,30);
innerwait.until(ExpectedConditions.elementToBeClickable(By.xpath(fieldID)));
driver.findelement(By.xpath(fieldID)).click();

但是等待函数会返回元素,即使它被另一个图像模糊并且不可点击。但是 click() 抛出异常

Element is not clickable at point (586.5, 278).
Other element would receive the click: <div>Loading image</div>

我是否必须每次在与任何元素交互之前检查加载图像是否出现?.(我无法预测加载图像何时出现并使所有元素雾化。)有没有有效的方法来处理这个问题?目前我正在使用以下功能等待加载图像消失,

public void wait_for_ajax_loading() throws Exception
{
    try{
    Thread.sleep(2000);
    if(selenium.isElementPresent("id=loadingPanel"))
    while(selenium.isElementPresent("id=loadingPanel")&&selenium.isVisible("id=loadingPanel"))//wait till the loading screen disappears
    {
         Thread.sleep(2000);
         System.out.println("Loading....");

    }}

    catch(Exception e){
        Logger.logPrint("Exception in wait_for_ajax_loading() "+e);
        Logger.failedReport(report, e);
        driver.quit();
        System.exit(0);
    }

}

但是不知道具体什么时候调用上面的函数,在错误的时间调用会失败。是否有任何有效的方法来检查元素是否实际上是可点击的?还是存在加载图像?

谢谢..

4

1 回答 1

2

鉴于您描述的情况,您必须验证以下两个条件之一:

  1. 您要点击的元素是否可点击?
  2. 阻止点击的原因仍然存在吗?

通常,如果WebDriver能够找到元素并且它是可见的,那么它也是可点击的。知道可能阻止它的可能原因,我宁愿选择验证这些原因。此外,它会在测试代码中更具表现力:在单击元素之前,您可以清楚地看到您在等待什么,正在检查什么,而不是在没有明显原因的情况下检查“可点击性”。我认为它可以让一个(阅读测试的人)更好地了解实际发生的(或可能发生的)事情。

尝试使用此方法检查加载图像是否不存在:

// suppose this is your WebDriver instance
WebDriver yourDriver = new RemoteWebDriver(your_hub_url, your_desired_capabilities);

......
// elementId would be 'loadingPanel'
boolean isElementNotDisplayed(final String elementId, final int timeoutInSeconds) {
    try {
        ExpectedCondition condition = new ExpectedCondition<Boolean>() {
            @Override
            public Boolean apply(final WebDriver webDriver) {
                WebElement element = webDriver.findElement(By.id(elementId));
                return !element.isDisplayed();
            }
        };
        Wait w = new WebDriverWait(yourDriver, timeoutInSeconds);
        w.until(condition);
    } catch (Exception ex) {
        // if it gets here it is because the element is still displayed after timeoutInSeconds
        // insert code most suitable for you
    }
        return true;
}

也许您将不得不根据您的代码对其进行一些调整(例如,在页面加载时查找元素一次并且只检查它是否显示)。

如果您不确定加载图像的确切时间(尽管我想您这样做了),您应该在每次单击由于加载图像而变得“不可点击”的元素之前调用此方法。如果加载图像存在,该方法将true在它消失后立即返回;如果它没有在“timeoutInSeconds”时间内消失,该方法将执行您选择的操作(例如,抛出带有特定消息的异常)。

您可以将其包装在一起,如下所示:

void clickSkippingLoadingPanel(final WebElement elementToClick) {
    if (isElementNotDisplayed('loadingPanel', 10)) {
        elementToClick.click();
    }
}

希望能帮助到你。

于 2013-06-24T14:05:11.113 回答