我正在用Java创建简单的采集卡供我使用。总的来说,我想做的是:


从主页获取所有链接,并检查它们是否是内部链接
将内部链接存储在listOld中(临时将它们存储在set中
避免重复的链接,然后保存到列表中)
前往listOld的连结
从页面获取所有链接,再次将它们存储在set中,然后存储在listNew中
返回第3步,但是请访问列表中的下一个链接(这只是一个
List上的“ for”循环遍历listOld上的每个元素
当访问列表中的所有链接时,比较listOld和listNew,每个
链接listNew(不在List上)将添加到listTemp。
来自listTemp和List的链接被添加到internalLinks
清除listOld和listNew,将listTemp内容添加到List
回到第三步
程序在第六步listTemp = null结束时结束(如此简单
 做...同时进行检查,在6号结束时检查更改为true
 步骤listTemp = null)


那是我的代码

package com.amazon.tests;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class Grabber {
    private WebDriver driver;
    private List<String> internalLinks = new ArrayList<String>();
    private Set<String> noDuplicates = new HashSet<>();
    private List<WebElement> linksOnPage = new ArrayList<>();
    private List<String> listOld = new ArrayList<>();
    private List<String> listNew = new ArrayList<>();
    private List<String> listTemp = new ArrayList<>();

    @BeforeClass
    public void setup() {
        System.setProperty("webdriver.chrome.driver","C:/TEST/LIB/chromedriver.exe");
        driver = new ChromeDriver();
    }

    @AfterClass
    public void teardown() {
        driver.close();
    }

    @Test
    public void grabber()
    {
        String hrefvalue = null;
        boolean check = false;


        driver.get("https://www.redbullmobile.pl/");
        linksOnPage = driver.findElements(By.tagName("a"));


        for (int i = 0; i<linksOnPage.size(); i++)
        {
            hrefvalue = linksOnPage.get(i).getAttribute("href");

            if(hrefvalue != null)
            {
                if(hrefvalue.contains("redbullmobile") && !hrefvalue.contains("facebook") && !hrefvalue.contains("redbullmobile.play.pl") && !hrefvalue.contains("redbullmobilecollect") && !hrefvalue.contains("fb.com") && !hrefvalue.contains(".pdf"))
                {
                    noDuplicates.add(linksOnPage.get(i).getAttribute("href"));
                }
            }
        }
        listOld.addAll(noDuplicates);
        hrefvalue = null;
        linksOnPage.clear();
        noDuplicates.clear();


    do
    {
        listTemp.clear();
        for (int i = 0; i<listOld.size(); i++)
        {
            driver.get(listOld.get(i));
            linksOnPage = driver.findElements(By.tagName("a"));
            for (int i1 = 0; i1<linksOnPage.size(); i1++)
            {
                hrefvalue = linksOnPage.get(i1).getAttribute("href");
                if(hrefvalue != null)
                {
                    if(hrefvalue.contains("redbullmobile") && !hrefvalue.contains("facebook") && !hrefvalue.contains("redbullmobile.play.pl") && !hrefvalue.contains("redbullmobilecollect") && !hrefvalue.contains("fb.com") && !hrefvalue.contains(".pdf"))
                    {
                        noDuplicates.add(linksOnPage.get(i1).getAttribute("href"));
                    }
                }
            }
        }
        //When all links from listOld are visited compare listOld and listNew, every link listNew that's not on List is added to listTemp.

        //Links from ListTemp and ListOld are added to ListFinal
        internalLinks.addAll(listOld);
        internalLinks.addAll(listTemp);
        //listOld and listNew are cleared, listTemp content is added to listOld
        listOld.clear();
        listNew.clear();
        listOld.addAll(listTemp);
        //Go back to 3rd step
        //Program end when at then end of 6th step listTemp = null (so simple do...while with check, check changes to true when at the end of 6th step listTemp = null)
        if (listTemp.isEmpty())
        {
            check = true;
        }
    }while(check);
    }
}


但是,我在第6步中遇到了问题。我真的不知道如何将listOld上的每个元素与listNew上的每个元素进行比较,然后将不匹配的元素添加到listTemp。有人可以帮我吗?

我还认为我可以通过在do...while开始之前将https://www.redbullmobile.pl/添加到listOld来缩短此代码(基本上消除(do...while开始之前的)代码。我是对还是错过了什么?

最佳答案

如您所知,List包含一个addAll方法,用于将列表的所有元素添加到第一个元素。

它还包含一个removeAll method来执行相反的操作。


  boolean removeAll(Collection c)
  
  从此列表中移除指定集合中包含的所有其元素

09-15 11:31