我试图访问网站中的所有链接,并想检查其状态(HTTP 200或500等)。我在处理点击某个链接后生成的新窗口时遇到问题。几个链接导致新的窗口,其他少数在同一个窗口打开。如何检查新窗口并切换到该窗口并返回主窗口。这是我的代码到目前为止:
public class TestLink {
//list to save visited links
static List<String> links = new ArrayList<String>();
WebDriver driver;
public TestLink(WebDriver driver) {
this.driver = driver;
}
public void linkTest() {
// loop over all the a elements in the page
try{
for(WebElement link : driver.findElements(By.tagName("a"))) {
// Check if link is displayed and not previously visited
if (link.isDisplayed()
&& !links.contains(link.getText())) {
// add link to list of links already visited
links.add(link.getText());
System.out.println(link.getText());
// click on the link. This opens a new page
link.click();
// call testLink on the new page
new TestLink(driver).linkTest();
}
}
driver.navigate().back();
}catch(StaleElementReferenceException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
WebDriver driver = new HtmlUnitDriver();
driver.get("http://www.flipkart.com/");
// start recursive linkText
new TestLink(driver).linkTest();
}
}
修改
下面的代码适用于字符串网址,但我想要网站中每个链接的状态代码。如何动态构建每个链接的URL。
public static int getResponseCode(String url) {
try {
WebClient client = new WebClient();
// webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
client.getOptions().setThrowExceptionOnFailingStatusCode(false);
if(url != null)
return client.getPage(url).getWebResponse().getStatusCode();
} catch (IOException ioe) {
throw new RuntimeException(ioe);
}
return 0;
}
答案 0 :(得分:0)
我认为这不是Selenium的预期用途,因此不鼓励使用此类用途。你最好使用一些http库甚至命令行实用程序,如cURL或wget与一些解析器一起使用。此外,webdriver不提供有关HTTP状态代码的任何信息。我会问这里 - 状态代码是什么?如果您加载新页面,通常会下载数十种不同的资源,每种资源都有自己的状态代码。
那就是说,如果你仍然想用Selenium做,那么是的,将所有可见的链接带到List<WebElement>
并发送点击给他们。默认情况下,新链接在新窗口中打开,因此在单击之前必须知道您的父窗口句柄,在单击等待新窗口句柄然后切换到它之后,执行您需要执行的操作并关闭窗口,启动下一轮循环。查看文档here,您可能对getWindowHandles()
和switchTo()
感兴趣。
对于状态代码,您需要通过代理路由您的流量。我会用browsermob。它可以获得HAR格式的性能数据,包括所有请求和响应,包括状态代码,因此您可以执行以下操作:
Har har = server.getHar();
if (har == null) return;
for (HarEntry entry : har.getLog().getEntries()){
if ((String.valueOf(entry.getResponse().getStatus()).startsWith("4"))
|| (String.valueOf(entry.getResponse().getStatus()).startsWith("5"))){
// take action
}
}