我遇到一个问题,我需要在下面显示的链接“PrestaShop”上使用Selenium Java执行点击。它在IFrame中,我的代码也在图片下方。
使用FireBug检查链接时,它显示如下
以下是我的代码
try {
List<WebElement> frames = getAllFrames();
for (int i = 0; i < frames.size(); i++) {
WebElement frame = frames.get(i);
driver.switchTo().frame(frame);
if (driver.findElement(By.xpath(".//*[@classname='_1drp _5lv6']/a")).getSize() != null) {
driver.findElement(By.className(".//*[@classname='_1drp _5lv6']/a")).click();
} else {
driver.switchTo().defaultContent();
}
}
} catch (NoSuchElementException ex) {
System.out.println(ex.getMessage());
}
代码获取页面上的所有帧并验证链接“PrestaShop”是否存在于帧上。如果是,则需要点击链接。现在,它返回错误消息 - Unable to locate element: .//*[@classname='_1drp _5lv6']/a
请帮助建议我如何在链接上成功点击点击?
答案 0 :(得分:0)
您可以使用以下更新的代码:
List<WebElement> frames = getAllFrames();
for (int i = 0; i < frames.size(); i++) {
WebElement frame = frames.get(i);
driver.switchTo().frame(frame);
if (driver.findElement(By.xpath("//*[contains(text(),'PrestaShop')]")).getSize() != null) {
driver.findElement(By.xpath("//*[contains(text(),'PrestaShop')]")).click();
} else {
driver.switchTo().defaultContent();
}
}
} catch (NoSuchElementException ex) {
System.out.println(ex.getMessage());
}
希望它对你有用。
答案 1 :(得分:0)
在检查元素的存在时,尝试使用findElements而不是findElement。下面的代码可能会给你一些想法。
List<WebElement> frames = getAllFrames();
for (int i = 0; i < frames.size(); i++) {
WebElement frame = frames.get(i);
driver.switchTo().frame(frame);
//use driver.findElements
if (driver.findElements(By.xpath(".//*[@classname='_1drp _5lv6']/a")).getSize() != null) {
driver.findElement(By.xpath("//*[contains(text(),'PrestaShop')]")).click();
} else {
driver.switchTo().defaultContent();
}
}
} catch (NoSuchElementException ex) {
System.out.println(ex.getMessage());
}
希望这会对你有所帮助。感谢。
答案 2 :(得分:0)
感谢您的评论。我意识到它因为FB链接加载太慢而导致代码失败。如果我在那里添加了Thread.sleep(30000),它现在可以点击下面的代码。
if (driver.findElements(By.xpath(".//*[@class='lfloat']/div/a")).size() > 0) {
System.out.println("Found elements.");
driver.findElement(By.xpath("//*[contains(text(),'PrestaShop')]")).click();
} else {
System.out.println("Element not found.");
driver.switchTo().defaultContent();
}
但是,如果我想要一个FluentWait,那么如果条件不满足,下面的代码就会停止
if (wait.ignoring(StaleElementReferenceException.class).ignoring(TimeoutException.class)
.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@class='lfloat']/div/a")))
.isDisplayed()) {
System.out.println("Found elements.");
driver.findElement(By.xpath("//*[contains(text(),'PrestaShop')]")).click();
} else {
System.out.println("Element not found.");
driver.switchTo().defaultContent();
}
它只返回消息Expected condition failed: waiting for visibility of element located by By.xpath: .//*[@class='lfloat']/div/a (tried for 30 second(s) with 500 MILLISECONDS interval)
,然后不继续循环。即使条件不满足,我能否知道使代码继续的方式是什么?