无法点击IFrame中的“PrestaShop”链接,如下图所示

时间:2017-06-08 06:45:53

标签: java selenium iframe frame

我遇到一个问题,我需要在下面显示的链接“PrestaShop”上使用Selenium Java执行点击。它在IFrame中,我的代码也在图片下方。

Link to be clicked

使用FireBug检查链接时,它显示如下

Inspect using 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

请帮助建议我如何在链接上成功点击点击?

3 个答案:

答案 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),然后不继续循环。即使条件不满足,我能否知道使代码继续的方式是什么?