如何在Selenium中等待页面重定向?

时间:2011-06-23 09:12:30

标签: ruby selenium selenium-ide

我正在尝试执行一项相对简单的任务:等到页面重定向完成。刚看到another回答了关于这个问题的问题,建议是等待后一页上的特定文本出现(如果我说得对)。如果是这样,那等待window.location会如何改变?好点吗?更差?不太适用?还有其他想法吗? 只是好奇,如果需要,可以将此问题标记为社区维基。

谢谢!

3 个答案:

答案 0 :(得分:2)

是的,使用Selenium时,我多次遇到过这个问题。我有两种解决这个问题的方法。首先,你可以实际改变隐含的等待时间。例如,给出这段代码:

Actions builder = new Actions( driver );
builder.click( driver.findElement( By.className("lala") ) ).perform();

如果在调用时没有找到与“lala”类匹配的元素,则此代码将抛出异常。您可以使用以下命令更改此隐式等待时间:

driver.manage().timeouts().implicitlyWait( 5, TimeUnit.SECONDS );

这使得驱动程序轮询5秒而不是立即失败。如果5秒后仍无法找到该元素,则该操作将失败。当然你可以改变那个设置。我发现这种方法在大多数情况下都能正常工作。大多数时候你不关心整个页面加载,只是某个部分。

我还编写了另一个函数Ge​​tElementByClassAndText,它将对元素的隐式等待执行相同的操作,除了它还检查包含的文本以允许更精细地详细说明您想要的内容:

public static void waitAndClick( WebDriver driver, By by, String text ) {
    WebDriverWait wait = new WebDriverWait( driver, 10000 );
    Function<WebDriver, Boolean> waitForElement = new waitForElement( by );
    wait.until( waitForElement );

    for( WebElement e : driver.findElements( by ) ) {
        if( e.getText().equals( text ) ) {
            Actions builder = new Actions( driver );
            builder.click( e ).perform();
            return;
        }
    }
}

它使用的相应功能:

public class waitForElement implements Function<WebDriver, Boolean> {
    private final By by;
    private String text = null;

    public waitForElement( By by ) {
        this.by = by;
    }

    public waitForElement( By by, String text ) {
        this.by   = by;
        this.text = text;
    }

    @Override
    public Boolean apply( WebDriver from ) {
        if( this.text != null ) {
            for( WebElement e : from.findElements( this.by ) ) {
                if( e.getText().equals( this.text ) ) {
                    return Boolean.TRUE;
                }
            }

            return Boolean.FALSE;
        } else {
            try {
                from.findElement( this.by );
            } catch( Exception e ) {
                return Boolean.FALSE;
            }

            return Boolean.TRUE;
        }
    }
}

我意识到你在Ruby中使用Selenium,但希望我的一些代码(至少在概念上)可以转让并对你有所帮助。

答案 1 :(得分:2)

监控值,返回driver.get_location完美地完成了我的工作。 显然,从我在5分钟内理解的内容中窥探代码是window.location.href值被监控。

答案 2 :(得分:-3)

您可以使用此功能,它将重新加载当前页面(重定向后): driver.getCurrentUrl();