寻找正确的Selenium测试定位器

时间:2016-07-19 17:38:59

标签: java html selenium

所以我正在研究这个项目,我需要为Selenium测试找到正确的定位器。我已经尝试了一堆不同的组合,我找不到合适的单击此链接。我尝试的所有内容都会抛出No Such Element异常。

我需要点击无序列表中的第一个链接。这是HTML

<main id="content" role="main">
  <nav id="product-list" role="navigation">
    <ul>
      <li id="firstTile">
        <a class="productLink" href="***LINK***" target="_top">
          <img src="***image ref***">
          <p>
            <span class="productName" title="First Tile"></span>
            <br>
            <small>This is the text for the first tile</small>
          </p>
        </a>
        <div class="item-footer cf">
          <hr>
      </li>
      <li id="secondTile">
        <li id="thirdTile">
          <li id="fourthTile" class="coming-soon">
    </ul>
  </nav>
  <div class="extra-links cf">
</main>

这是我的Java:

测试课

// All imports

public class Test {

    private Home home;
    //All other variables

    @Before
    public void setup() {
        driver = new FirefoxDriver();
    }

    @Test
    public void clickFirstTile() {
        home = new Home(driver);
        home.clickFirstTile();
    }

    @After
    public void tearDown() {
        driver.quit();
    }
}

还有我的主页对象类:

public class Home {

    private WebDriver driver;
    By firstTileBtnLocator = By.id("firstTile");

    public Home(WebDriver driver) {
        this.driver = driver;
        // I've replaced my site with this fake url. The real site url works.
        driver.navigate().to("http://myfakesite.com");
    }

    public void clickFirstTile() {
        driver.findElement(firstTileBtnLocator).click();
    }
}

4 个答案:

答案 0 :(得分:0)

尝试以下方法:

By firstHref = By.cssSelector("li[id='firstTile'] a");

By firstHref = By.cssSelector("a.productLink");

答案 1 :(得分:0)

我建议使用不同的定位器

By firstTileBtnLocator = By.cssSelector("#firstTile a.product-link");

我猜有很多

<a class="productLink" href="***LINK***" target="_top">
页面上的

元素。上面的CSS选择器将仅定位<li id="firstTile">下的那个。

看到网站后,问题是该元素位于IFRAME内,并且您发布的HTML中存在错误(ID不正确)。我已经尝试了下面的代码并且它可以工作。

driver.get("http://www.wolframcloud.com/");
driver.switchTo().frame(0);
driver.findElement(By.cssSelector("#wdp-tile a.product-link")).click();
driver.switchTo().defaultContent();

您可以在课程中编辑几个地方。

By firstTileBtnLocator = By.cssSelector("#wdp-tile a.product-link");

public void clickFirstTile() {
    driver.switchTo().frame(0);
    driver.findElement(firstTileBtnLocator).click();
}

我认为应该照顾它。

有关处理IFRAME的更多信息。

How to switch between frames in Selenium WebDriver using Java

答案 2 :(得分:0)

您应该尝试使用WebDriverWait等待元素可点击,如下所示: -

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement el = wait.until(ExpectedConditions.elementToBeClickable(By.linkText("This is the text for the first tile")));
el.click();

希望它有帮助...:)

答案 3 :(得分:0)

请试试这个:

wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.name("nameofframe")));

driver.findElement(By.xpath("//a[@target='_top' and @class='productLink']")).getAttribute("href");

如果您有多个目标=&#39; _top&#39;和class =&#39; productLink&#39;,您可以在列表中找到元素

List<WebElement> anchors=driver.findElements(By.xpath("//a[@target='_top' and @class='productLink']"));

然后迭代锚点列表并单击第0个元素,如

anchors.get(0).click();

让我知道它是否有效