【问题标题】:Appending to domain stored in variable附加到存储在变量中的域
【发布时间】:2019-09-18 03:31:49
【问题描述】:

我正在使用 Selenium Webdriver + Java + TestNG(以防万一)

我要做的是获取当前域,将其存储为变量,然后在该变量上附加一些内容并导航到生成的 URL。

这是我正在尝试的,它获取域但导航失败。说这是一个无效的论点。

String CurrentURL = driver.getCurrentUrl();
JavascriptExecutor js = (JavascriptExecutor) driver;
String domain = (String) js.executeScript("return document.domain");
System.out.println("My Current Domain is: "+domain);
driver.navigate().to(domain+"/lightning/o/Lead/home");

【问题讨论】:

    标签: java selenium url append


    【解决方案1】:

    根据 Class URI 的 java 文档:

    public final class URI
    extends Object
    implements Comparable<URI>, Serializable
    Represents a Uniform Resource Identifier (URI) reference.
    

    URI 实例有以下九个组成部分:

    Component               Type
    --------------------    ------
    scheme                  String
    scheme-specific-part    String
    authority               String
    user-info               String
    host                    String
    port                    int
    path                    String
    query                   String
    fragment                String
    

    由于您已经通过getCurrentUrl() 提取了 当前 url,您可以将 当前 url 转换为 uri 并提取每个组件如下(使用https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/package-summary.html):

    • 代码块:

      import java.net.URI;
      import org.openqa.selenium.WebDriver;
      import org.openqa.selenium.chrome.ChromeDriver;
      import org.openqa.selenium.chrome.ChromeOptions;
      
      public class A_demo 
      {
          public static void main(String[] args) throws URISyntaxException 
          {
              System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
              ChromeOptions options = new ChromeOptions();
              options.addArguments("start-maximized");
              WebDriver driver = new ChromeDriver(options);
              driver.get("https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/package-summary.html");
              String CurrentURL = driver.getCurrentUrl();
              URI uri = new URI(CurrentURL);
              System.out.println("Scheme: "+uri.getScheme());
              System.out.println("Scheme-specific-part: "+uri.getSchemeSpecificPart());
              System.out.println("Authority: "+uri.getAuthority());
              System.out.println("User-info: "+uri.getUserInfo());
              System.out.println("Host: "+uri.getHost());
              System.out.println("Port: "+uri.getPort());
              System.out.println("Path: "+uri.getScheme());
              System.out.println("Query: "+uri.getQuery());
              System.out.println("Fragment: "+uri.getFragment());
          }
      }
      
    • 控制台输出

      Scheme: https
      Scheme-specific-part: //seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/package-summary.html
      Authority: seleniumhq.github.io
      User-info: null
      Host: seleniumhq.github.io
      Port: -1
      Path: https
      Query: null
      Fragment: null
      

    最后,要构造 https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriver.html 的结果 URL,您可以这样做:

    driver.navigate().to(uri.getScheme()+"://"+uri.getHost()+"/selenium/docs/api/java/org/openqa/selenium/WebDriver.html");
    

    【讨论】:

    • 好的,这行得通,但它要求我将 throws URISyntaxException 放在调用它的函数中。由于这是一个导航的东西,它将在每个脚本中被调用。抛出 URISyntaxException 会导致任何问题吗?我不熟悉必须使用这样的东西,因为我是一个相对新手。
    • @ShelleyCollett 是的,你是对的。 URI 应该抛出 URISyntaxException。更新了答案。我在我的框架中使用基础 Exception 进行开发。
    【解决方案2】:

    document.domain 不返回 http/https,例如它为此网站返回“stackoverflow.com”。

    我会用你开始的,

    String CurrentURL = driver.getCurrentUrl();
    

    将该 URL 转换为 java.net.URI,然后使用 .getHost()。您可以将这一切包装成一个方法,如

    public static String getDomainName(String url) throws URISyntaxException {
        URI uri = new URI(url);
        String domain = uri.getHost();
        return domain.startsWith("www.") ? domain.substring(4) : domain;
    }
    

    然后这样称呼它

    String domainName = getDomainName(driver.getCurrentUrl());
    

    This answer 是我获得该方法的地方,它列出了有关此方法的注意事项,但听起来它可能对您有用。

    【讨论】:

    • 谢谢!但是,它得到了我需要的域。我在打印时看到了这一点。问题是我无法让它导航到该域(并附加到它),我不明白为什么。这是我正在尝试制作的导航部分,对我来说为什么它不起作用但又一次,我正在学习java
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多