所以我正在研究这个项目,我需要为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();
}
}
答案 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();
让我知道它是否有效