java - 比较两个列表的内容,Java,Selenium

标签 java selenium arraylist compare

我正在用 Java 创建简单的抓取器供我使用。总的来说,我想做的事情是:

  1. 从主页获取所有链接并检查它们是否是内部链接
  2. 将内部链接存储在列表中(暂时将它们存储在集合中) 避免重复链接然后保存到列表)
  3. 访问旧列表中的链接
  4. 从页面获取所有链接,再次将它们存储在 set 中,然后存储在 listNew 中
  5. 返回到第 3 步,但访问列表中的下一个链接(这只是一个 List 上的“for”循环,迭代 listOld 上的每个元素)
  6. 当列表中的所有链接都被访问时,比较 listOld 和 listNew,每个 不在 List 上的链接 listNew 将添加到 listTemp。
  7. 来自 listTemp 和 List 的链接将添加到内部链接
  8. listOld 和 listNew 被清除,listTemp 内容被添加到 List
  9. 返回第三步
  10. 程序在第 6 步结束时结束 listTemp = null (如此简单 do...while with check,检查在 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)

Removes from this list all of its elements that are contained in the specified collection

关于java - 比较两个列表的内容,Java,Selenium,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50944995/

相关文章:

java - 有时必须等待很长时间,直到 HttpClient.execute() 抛出异常

python - 是否可以在 selenium 中打开新窗口,将焦点作为屏幕上的主窗口?

node.js - Selenium 等待并点击使用nodejs

java - 使用Iterator遍历ArrayList并使用instanceof设置对象

java - 在类中定义的方法在泛型类 (Java) 中找不到

java - 顶部带有标签的选项卡式 Pane

java - 在什么情况下 getInstance 将返回 null 以及在多线程环境中如何返回

java - 将字节拆分为位

javascript - Python 请求和 Forbes 'Welcome' 页面重定向

java - 尝试在 ListView 中显示从 CSV 文件读取的数据