我正在用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)
从此列表中移除指定集合中包含的所有其元素