我正在尝试执行一项相对简单的任务:等到页面重定向完成。刚看到another回答了关于这个问题的问题,建议是等待后一页上的特定文本出现(如果我说得对)。如果是这样,那等待window.location
会如何改变?好点吗?更差?不太适用?还有其他想法吗? 只是好奇,如果需要,可以将此问题标记为社区维基。
谢谢!
答案 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秒后仍无法找到该元素,则该操作将失败。当然你可以改变那个设置。我发现这种方法在大多数情况下都能正常工作。大多数时候你不关心整个页面加载,只是某个部分。
我还编写了另一个函数GetElementByClassAndText,它将对元素的隐式等待执行相同的操作,除了它还检查包含的文本以允许更精细地详细说明您想要的内容:
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();