【问题标题】:Web Driver: how to catch dynamically changing URL?Web Driver:如何捕捉动态变化的 URL?
【发布时间】:2016-02-22 08:29:17
【问题描述】:

我需要捕捉点击登录按钮后动态变化的 URL 值。 driver.getCurrentUrl() 仅保存最新的 url,它是静态的。我需要以某种方式保存在登录过程中动态变化的几个 url,并将其保存到字符串或某个数组中。有人可以帮帮我吗?

@Test
public void expireTest() {
    driver.get("https://url/default/login");
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    driver.findElement(By.id("username")).sendKeys("name");
    driver.findElement(By.id("password")).sendKeys("pass");
    driver.findElement(By.cssSelector("input[value='someInputValue']")).click();
    getUrlValue();
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.MILLISECONDS);

}

public void getUrlValue() {
    String urlValue = driver.getCurrentUrl().toString();
    if(urlValue.contains("expires_in")){
        String newValue = driver.getCurrentUrl().toString();
        System.out.print(newValue);
    }

【问题讨论】:

  • 如果我理解清楚,你想捕获网络流量,有办法使用browsermobproxy,它可以捕获日志并将其保存为易于阅读的json格式,如果你愿意我可以使用 java 发布一个示例(您可以在 c# 中做同样的事情)。

标签: java selenium selenium-webdriver webdriver


【解决方案1】:

您可以尝试将网址添加到List,如果它们不存在,直到您拥有基本网址

public void getUrlValue(List<String> urls) {
    String url;
    while (!(url = driver.getCurrentUrl()).equals(url4))
    {
        if (urls.contains(url)) {
            urls.add(url);
        }
    }
}

这应该在列表中插入四个不同的 url。

【讨论】:

  • 不,它不起作用。 getCurrentUrl() 无法保存动态变化的值的问题;也许 webDriver 有另一种方法来捕捉价值?
  • @DimencionRider 你是什么意思?它返回旧网址?
  • 工作原理:我需要保存 4 个 URL 的值:(url1, url2, url3, url4(static value));单击“登录”按钮后,应用程序开始动态加载,其中包含大约半秒可见的三个链接(url1、url2、url3)。只有在该过程之后,我们才能看到由 getCurrentUrl() 方法保存的主页和静态链接(url4)。我们如何将登录过程中动态变化的所有 url 保存到数组中?
【解决方案2】:

首先,我不确定您为什么要这样做。为什么不在登录完成时等待一个元素?如果你真的想做你所要求的,你可以使用显式等待来做到这一点。类似的东西

 WebDriverWait wait = new WebDriverWait(driver, 30);
 final List<String> urls = new ArrayList<String>();
 wait.until(new Function<WebDriver, Object>() {
        public Boolean apply(WebDriver driver) {
             String url = driver.getCurrentUrl();
             if(!url.contains("uniqueWordInOriginalUrl")) {
                 urls.add(url);
             }
             if(urls.size()!=4) {
                 return false;
             } else {
                 return true;
             }
         }
 });

如果您想避免这种情况并等待某个元素可见,您可以使用ExpectedConditions 中的内部方法来实现

driver.get("https://url/default/login");
driver.findElement(By.id("username")).sendKeys("name");
driver.findElement(By.id("password")).sendKeys("pass");
driver.findElement(By.cssSelector("input[value='someInputValue']")).click();
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("foo"))).click();

【讨论】:

  • 谢谢,我会试试你的解决方法。但是,问题是 getCurrentUrl();只获取静态网址。我们无法捕捉到一直在变化的动态 url。
  • 试试这个。预期条件的全部意义在于继续轮询某些东西,因此希望这会奏效。你这样做有什么特别的原因吗?
  • 我正在尝试捕获 auth_token 值
【解决方案3】:

每隔 100 毫秒一个单独的线程监控 URL 怎么样?

【讨论】:

  • 不懂Java,我是C#程序员。 Java中有没有类似BackgroundWorker类的东西?
  • 这不是答案,只是评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
相关资源
最近更新 更多