【问题标题】:Actions and htmlunitdriver - speed issue操作和 htmlunitdriver - 速度问题
【发布时间】:2013-02-12 13:08:55
【问题描述】:

我的 Web 应用程序具有在 MouseOver 上打开的菜单。我正在使用 htmlunitdriver 编写测试。

触发菜单的测试代码是

    Actions builder = new Actions(driver);
    WebElement menu = driver.findElement(By.xpath("//a[starts-with(@href,'/index.html')]"));
    Thread.sleep(2000);
    builder.moveToElement(menu).build().perform();
    Thread.sleep(2000);
    driver.findElement(By.xpath("//a[starts-with(@href,'/submenuitem')]")).click();
    driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);

当我运行一个测试时,它通过就好了。但是当我尝试一次运行所有 80 个测试时,我得到了

无法使用 //a[starts-with(@href,'/submenuitem' 定位节点

估计子菜单还没打开,htmlunitdriver 速度太快了。有时会出现“您可能只与可见元素交互也发生在单次运行中。有人可以帮我解决这个问题吗?使用 FirefoxDriver 左右对我来说不是一个选项。

【问题讨论】:

    标签: selenium selenium-webdriver htmlunit xpath


    【解决方案1】:

    使用手动 Thread.sleep(time) 来等待 selenium 操作是一种肮脏的解决方案,根本不应该使用。

    相反,您可以在与元素交互之前检查元素是否可见。

    public void waitUntilVisible(WebDriver driver, WebElement element){
        WebDriverWait waiting = new WebDriverWait(driver, 10);
        waiting.until(ExpectedConditions.visibilityOf(element));
    }
    
    public void waitUntilClickable(WebDriver driver, By locator){
        WebDriverWait waiting = new WebDriverWait(driver, 10);
        waiting.until(ExpectedConditions.elementToBeClickable(locator));
    }
    
    Actions builder = new Actions(driver);
    WebElement menu = driver.findElement(By.xpath("//a[starts-with(@href,'/index.html')]"));
    
    waitUntilVisible(driver, menu);
    builder.moveToElement(menu).build().perform();
    
    WebElement menuItem = driver.findElement(By.xpath("//a[starts-with(@href,'/submenuitem')]"));
    
    waitUntilClickable(driver, By.xpath("//a[starts-with(@href,'/submenuitem')]"));
    menuItem.click();
    

    【讨论】:

    • 可点击和可见性有显着差异吗?
    • elementToBeClickable 会进行 visibilityOf 检查 检查元素是否已启用(对于按钮、输入)。
    • 我可以假设使用可点击的,例如on li-tag 会导致错误?
    • 它不会导致错误,因为在任何其他元素上检查 isEnabled 什么都不做。所以,对于
    • ,waitUntilClickable 和 waitUntilVisible 是等价的。
    【解决方案2】:

    在找到submenu 项目后,您正在使用implicit wait。我认为那里没有隐式等待。使用隐式等待最可取的地方是在初始化Driver instance 之后声明。

    还有一个解决方案,您可以使用Explicit Wait 来等待页面中的元素。

    请参阅post 了解有关 Selenium 等待的更多信息。

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签