org.openqa.selenium.InvalidArgumentException:未知错误:不支持的协议

新手上路,请多包涵

我添加了网页中的所有链接 Arraylist 然后一一点击所有网址。

 public class Redirectionlinked1
{
    public static List findAllLinks(WebDriver driver)
    {
        List <WebElement> elementList = new ArrayList();
        elementList = driver.findElements(By.tagName("a"));
        elementList.addAll(driver.findElements(By.tagName("img")));

        List finalList = new ArrayList();
        for(WebElement element : elementList)
        {
            if (element.getAttribute("href") != null)
            {
                finalList.add(element);
            }
        }
        return finalList;
    }

    public static void main(String[] args) throws Exception
    {
        System.setProperty("webdriver.gecko.driver", "E:\\Softwares\\gecko\\geckodriver-v0.16.1-win64\\geckodriver.exe");
        System.setProperty("webdriver.chrome.driver", "E:\\chromedriver.exe");

        WebDriver driver = new ChromeDriver();
        driver.get(" http://testsite.com");
        List <WebElement > allImages = findAllLinks(driver);

        System.out.println("Total number of elements found " + allImages.size());
        driver = new ChromeDriver ();
        URI uri =null;
        for (WebElement element : allImages) {
        if (!driver.getCurrentUrl().equals(element.getAttribute("href")) && driver.)
        {
            driver.manage().deleteAllCookies();
            driver.get(element.getAttribute("href"));
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            Thread.sleep(500);
            System.out.println(element.getAttribute("href"));
            uri = new URI(driver.getCurrentUrl());
            try
            {
                if(uri.getHost().equalsIgnoreCase("SpecificDomain.net"))
                {
                    System.out.println(" Redirected URL-->> "+element.getAttribute("href"));
                }
            }
            catch (Exception e)
            {
                    e.printStackTrace();
            }
        }
   }
}

代码按预期工作(它在浏览器中启动 URL),第一个链接稍后抛出错误:

线程“主”中的异常 org.openqa.selenium.InvalidArgumentException:未知错误:不支持的协议(会话信息:chrome = 58.0.3029.110)(驱动程序信息:chromedriver = 2.26.436362(5476ec6bf7ccbada1734a0cdec7d570bb042aa30),平台= Windows NT 6.1.760 x86_64)(警告:服务器未提供任何堆栈跟踪信息)命令持续时间或超时:131 毫秒构建信息:版本:’未知’,修订:’3169782’,时间:’2016-09-29 10:24:50 - 0700’ 系统信息:主机:’ETPUN-LT009’,ip:’192.168.2.193’,os.name:’Windows 7’,os.arch:’amd64’,os.version:’6.1’,java.version: ‘1.8.0_111’ 驱动信息:org.openqa.selenium.chrome.ChromeDriver 能力 [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.26.436362 (5476ec6bf7ccbada1734a0bbcdec72da570), user C:\scoped_dir12784_32532}, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=58.0.3029.110, platform=XP, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, unexpectedAlertBehaviour=}] Session ID: df813868289a8f15f947ac620b3b1882 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206) 在 org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler .java:164) 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:636) 在 org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDri ver.java:323) 在 Practices.Redirectionlinked1.main(Redirectionlinked1.java:99)

我的配置是:-

Chrome - 版本 58.0.3029.110(64 位)

Geckodriver-v0.16.1-win64

Windows 7的

爪哇 - 1.8.1

原文由 user3302083 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

这可能是因为您网站中的 hre 链接看起来像 # , resources/123.img 不是完整的 URL,触发 get 将导致异常。您应该进行检查以确保网址有效。这可以通过使用比较 link.startsWith("http://") || link.startsWith("https://")

还有其他地方您的测试也会失败。

  1. finalList 声明为列表并返回。这必须更改为 List 并且应该用有价值的链接填充。这是因为我们有一个 for 循环,您在其中调用 driver.get(newLink) 这将重置 finalList 中的所有 WebElement 对象,因为它们较早发现并给出异常。

  2. img 标签没有 href 。而是使用“src”。

这是所有这些更改后的代码。请注意,可能还有其他条件来检查 URL 是否有效,我没有在此处列出。

     public static List<String> findAllLinks(WebDriver driver) {

        // Declare finalList as string.
        List<String> finalList = new ArrayList<>();

        // Get the a tags
        List<WebElement> elementList = driver.findElements(By.tagName("a"));
        // get the img tags
        elementList.addAll(driver.findElements(By.tagName("img")));

        for (WebElement element : elementList) {
            // a tags have "href", img tags have src
            String link = element.getTagName().equalsIgnoreCase("a") ? element.getAttribute("href")
                    : element.getAttribute("src");
            // Check if link is not null and whether is a valid link by checking
            // starts with http or https
            if (link != null && (link.startsWith("http://") || link.startsWith("https://"))) {
                finalList.add(link);
            }
        }
        return finalList;
    }

    public static void main(String[] args) throws Exception {
        System.setProperty("webdriver.gecko.driver",
                "E:\\Softwares\\gecko\\geckodriver-v0.16.1-win64\\geckodriver.exe");
        System.setProperty("webdriver.chrome.driver", "E:\\chromedriver.exe");

        WebDriver driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("http://testsite.com");
        List<String> allLinks = findAllLinks(driver);

        System.out.println("Total number of elements found " + allLinks.size());
        driver = new ChromeDriver();
        URI uri = null;
        for (String link : allLinks) {
            if (!driver.getCurrentUrl().equals(link)) {
                driver.manage().deleteAllCookies();
                driver.get(link);

                Thread.sleep(500);

                System.out.println(link);
                uri = new URI(driver.getCurrentUrl());
                try {
                    if (uri.getHost().equalsIgnoreCase("SpecificDomain.net")) {
                        System.out.println("Redirected URL-->> " + link);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

原文由 Sighil 发布,翻译遵循 CC BY-SA 3.0 许可协议

升级您的 selenium 网络驱动程序。这是网络驱动程序和您的浏览器版本的兼容性问题。我用最新版本的 chrome 网络驱动程序更新了我的 pom 文件并且它有效。将 chrome web driver 版本升级到 3.9.1 及以上也可以解决问题。

 <dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-chrome-driver</artifactId>
    <version>4.0.0-alpha-5</version>
</dependency>

原文由 user13709336 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题