使用Selenium和Java查找Broken链接
问题陈述
在网页上查找损坏的链接可以分为两个步骤
1.查找页面上的所有链接。
2.如果链接断开,请迭代检查链接。
所有链接通常都在图像<img />和网页上的锚点标签<a/>。此外,所有链接都被称为元素标记的href属性。
例如:<a href="http://toolsqa.com/selenium-introduction/">简介</a>。这将显示为文本“简介”的链接。
让我们进入细节。第1步是查找所有图像和锚标记元素。在此步骤中,您还希望过滤掉没有href属性的元素。下面是显示如何执行此操作的代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public
static
List
findAllLinks
(
WebDriver
driver
)
{
List
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
;
}
|
正如您在上面的函数中看到的,我们首先在List <WebElement> elementList中收集所有锚和图像标记。在for循环之后,我们将过滤掉所有没有任何href标记的元素。这样我们就可以在其中包含所有带有href标签的元素。
现在最重要的部分是检查链接是否正常工作。这是第2步。这里我将向您介绍一个来自Java的类,名为HttpURLConnection类。此类用于向托管在步骤1中提取的链接的Web服务器发出HTTP请求。
您可以在此处阅读有关此课程的更多信息
基本思想是对步骤1中提取的URL发出HTTP请求,并查看服务器返回的响应。根据响应,我们可以确定链接是否被破坏。我将向您介绍HTTP请求方法的最小实现。您可以修改它以满足您的需求,但这应该可以解决问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public
static
String
isLinkBroken
(
URL
url
)
throws
Exception
{
//url = new URL("https://yahoo.com");
HttpURLConnection
connection
=
(
HttpURLConnection
)
url
.
openConnection
(
)
;
try
{
connection
.
connect
(
)
;
String
response
=
connection
.
getResponseMessage
(
)
;
connection
.
disconnect
(
)
;
return
response
;
}
catch
(
Exception
exp
)
{
return
exp
.
getMessage
(
)
;
}
}
|
这段代码对我们提取的链接进行HTTP调用,并从服务器返回响应,作为字符串,函数中的return语句。
如果发生异常,我们会收到异常消息。它包含有关从服务器返回异常的原因的更多详细信息。
此处列出完整代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
package
Selenium
.
Locators
;
import
java
.
util
.
List
;
import
java
.
net
.
MalformedURLException
;
import
java
.
net
.
URL
;
import
java
.
util
.
ArrayList
;
import
java
.
util
.
HashSet
;
import
java
.
util
.
Iterator
;
import
java
.
util
.
NoSuchElementException
;
import
java
.
util
.
Set
;
import
java
.
util
.
concurrent
.
TimeUnit
;
import
org
.
openqa
.
selenium
.
By
;
import
org
.
openqa
.
selenium
.
JavascriptExecutor
;
import
org
.
openqa
.
selenium
.
Keys
;
import
org
.
openqa
.
selenium
.
WebDriver
;
import
org
.
openqa
.
selenium
.
WebDriver
.
Navigation
;
import
org
.
openqa
.
selenium
.
WebDriver
.
Options
;
import
org
.
openqa
.
selenium
.
WebElement
;
import
org
.
openqa
.
selenium
.
firefox
.
FirefoxDriver
;
import
org
.
openqa
.
selenium
.
firefox
.
FirefoxProfile
;
import
org
.
openqa
.
selenium
.
support
.
ui
.
*
;
import
com
.
google
.
common
.
base
.
Function
;
import
com
.
google
.
common
.
base
.
Predicate
;
import
Selenium
.
utils
.
*
;
//import org.openqa.selenium.*;
//import org.openqa.selenium.firefox.*;
public
class
program
{
public
static
List
findAllLinks
(
WebDriver
driver
)
{
List
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
String
isLinkBroken
(
URL
url
)
throws
Exception
{
//url = new URL("https://yahoo.com");
String
response
=
""
;
HttpURLConnection
connection
=
(
HttpURLConnection
)
url
.
openConnection
(
)
;
try
{
connection
.
connect
(
)
;
response
=
connection
.
getResponseMessage
(
)
;
connection
.
disconnect
(
)
;
return
response
;
}
catch
(
Exception
exp
)
{
return
exp
.
getMessage
(
)
;
}
}
public
static
void
main
(
String
[
]
args
)
throws
Exception
{
// TODO Auto-generated method stub
FirefoxDriver
ff
=
new
FirefoxDriver
(
)
;
ff
.
get
(
"http://toolsqa.com/automation-practice-switch-windows/"
)
;
//ff.get("http://www.yahoo.com/");
List
allImages
=
findAllLinks
(
ff
)
;
System
.
out
.
println
(
"Total number of elements found "
+
allImages
.
size
(
)
)
;
for
(
WebElement
element
:
allImages
)
{
try
{
System
.
out
.
println
(
"URL: "
+
element
.
getAttribute
(
"href"
)
+
" returned "
+
isLinkBroken
(
new
URL
(
element
.
getAttribute
(
"href"
)
)
)
)
;
//System.out.println("URL: " + element.getAttribute("outerhtml")+ " returned " + isLinkBroken(new URL(element.getAttribute("href"))));
}
catch
(
Exception
exp
)
{
System
.
out
.
println
(
"At "
+
element
.
getAttribute
(
"innerHTML"
)
+
" Exception occured -> "
+
exp
.
getMessage
(
)
)
;
}
}
}
}
|
注意:不要介意这么多的导入,它来自我以前的项目设置。你可以删除不必要的。
我已经在控制台中打印了结果,一旦运行此代码,您将得到这样的输出
你可能得到的结果
而不是OK,你也可能被重定向。这意味着在请求之后用户被重定向到不同的URL。这通常是一个棘手的情况,因为大多数损坏的链接会将您重定向到静态错误页面。理想情况下,您应该只信任那些返回OK的网址,如上面的结果图所示,其余应该验证一次。
这是在网页上查找断开链接的非常简单的实现。这篇文章的想法是获得基础知识,以便您可以在其上进行构建,以使复杂的结构适合您的项目。
谢谢
Virender