2

在为 web 应用程序编写 selenium 测试用例时,我遇到了 xpath 选择器的问题。Selenium 应单击的 HTML 代码元素如下:

<a title="Voeg een vak toe" href="#" onclick="javascript:$.colorbox({width:818,href:'/olo-cleanjump/profiel/addVakForm'}); return false;">
  <p class="add">
    <img class="add-icon" src="/olo-cleanjump/static/images/icon_add.png"/>
    Voeg vak toe
  </p>
</a>

用于 firefox 的 Selenium IDE 插件为此提供了以下 selenium 代码:

driver.findElement(By.cssSelector("p.add")).click();

此链接调用的 addVakForm javascript 函数会打开一个颜色框,其中包含以下 HTML(我将其缩短,大约有 30 个类似的 div 类为“lesboek_popup”):

<div id="cboxLoadedContent" style="display: block; width: 776px; overflow: auto; height: 653px;">
  <div id="profielpagina_add">
    <h2>Voeg een vak toe aan je profiel</h2>
    <div class="lesboek_popup">
      <a class="content" href="/olo-cleanjump/profiel/addvak/120776">
        <img src="" alt="">
      </a>
      <p class="caption">
        <a href="/olo-cleanjump/profiel/addvak/120776">Engels</a>
      </p>
    </div>
    <div class="lesboek_popup">
      <a class="content" href="/olo-cleanjump/profiel/addvak/120786">
        <img src="" alt="">
      </a>
      <p class="caption">
        <a href="/olo-cleanjump/profiel/addvak/120786">Biologie</a>
      </p>
    </div>
  </div>

对于测试,我想打开“Biologie”链接。Selenium IDE 为我提供了以下 selenium 代码来执行此操作

driver.findElement(By.xpath("//div[@id='profielpagina_add']/div[20]/a")).click();

选择这个生物链接元素。基于此,我编写了以下测试用例:

 Test
public void testAddRemoveVak() throws Exception {
    this.get("");

    // vak 1 toevoegen
    driver.findElement(By.cssSelector("p.add")).click();
    driver.findElement(By.xpath("//div[@id='profielpagina_add']/div[20]/a")).click();

    // vak 2 toevoegen
    driver.findElement(By.cssSelector("p.add")).click();
    driver.findElement(By.xpath("//div[@id='profielpagina_add']/div[20]/a")).click();

    assertEquals(driver.findElements(By.xpath("//li[@class='vak']")).size(), 2);

    // vak 2 verwijderen
    this.get("profiel/removevak/120791");

    assertEquals(driver.findElements(By.xpath("//li[@class='vak']")).size(), 1);
}

那个部分

driver.findElement(By.cssSelector("p.add")).click(); 

实际上是成功的,所以在这个调用之后应该加载颜色框。然而

driver.findElement(By.xpath("//div[@id='profielpagina_add']/div[20]/a")).click();

导致 NoSuchElementException,而当我检查自己时,这个元素肯定存在于颜色框中(调用/xpath 甚至是由 Selenium IDE 自动生成的)。有谁知道可能导致 NoSuchElementException 的原因?

4

1 回答 1

5

当您的弹出窗口出现时,您可能应该等待。尝试使用隐式等待

WebDriver driver = new FirefoxDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));

driver.FindElement(By.LinkText("Biologie")).click()如果它是您页面上带有文本 Biologie 的唯一链接,您也可以使用 xpath 而不是 xpath

于 2012-04-05T16:03:57.870 回答