在Selenium中使用HttpURLConnection时如何修复403响应,因为链接是手动打开的,没有任何问题
我正在用SeleniumWeb驱动程序和java检查网站中的活动链接。我已将链接传递到阵列,在验证时,我得到的响应为403禁止站点中的所有链接。这只是一个任何人都可以访问的公共网站。手动单击时,链接工作正常。我想知道为什么它没有显示200以及在这种情况下可以做些什么 这是针对使用Java的SeleniumWebDriver的在Selenium中使用HttpURLConnection时如何修复403响应,因为链接是手动打开的,没有任何问题,selenium,selenium-webdriver,httpresponse,httpconnection,Selenium,Selenium Webdriver,Httpresponse,Httpconnection,我正在用SeleniumWeb驱动程序和java检查网站中的活动链接。我已将链接传递到阵列,在验证时,我得到的响应为403禁止站点中的所有链接。这只是一个任何人都可以访问的公共网站。手动单击时,链接工作正常。我想知道为什么它没有显示200以及在这种情况下可以做些什么 这是针对使用Java的SeleniumWebDriver的 for(int j=0;j< activelinks.size();j++) { System.out.println("Active Link ad
for(int j=0;j< activelinks.size();j++) {
System.out.println("Active Link address and status >>> " + activelinks.get(j).getAttribute("href"));
HttpURLConnection connection = (HttpURLConnection)new URL(activelinks.get(j).getAttribute("href")).openConnection();
connection.connect();
String response = connection.getResponseMessage();
int responsecode = connection.getResponseCode();
connection.disconnect();
System.out.println(activelinks.get(j).getAttribute("href")+ ">>"+ response+ " " + responsecode);}
for(int j=0;j>>”+活动链接.get(j).getAttribute(“href”);
HttpURLConnection connection=(HttpURLConnection)新URL(activelinks.get(j).getAttribute(“href”)).openConnection();
connection.connect();
字符串响应=connection.getResponseMessage();
int responsecode=connection.getResponseCode();
连接断开();
System.out.println(activelinks.get(j).getAttribute(“href”)+“>>”+response+“”+responsecode);}
我希望响应代码为200,但实际输出为403</p>< p>我相信您需要添加相关的HTTPURLION,或者更好地考虑切换到引擎盖下的库。 因此,您基本上需要使用从浏览器获取cookie,并为后续调用生成适当的cookie 示例代码:
driver.manage().getCookies()
.forEach(cookie -> cookieBuilder
.append(cookie.getName())
.append("=")
.append(cookie.getValue())
.append(";"));
OkHttpClient client = new OkHttpClient().newBuilder().build();
for (WebElement activelink : activelinks) {
Request request = new Request.Builder()
.url(activelink.getAttribute("href"))
.addHeader("Cookie", cookieBuilder.toString())
.build();
Response urlResponse = client.newCall(request).execute();
String response = urlResponse.message();
int responsecode = urlResponse.code();
System.out.println(activelink.getAttribute("href") + ">>" + response + " " + responsecode);
}
如果您只需要响应代码,您可以考虑使用方法避免执行对完整URL的调用——这将允许您节省流量,并且测试将更快得多。p> 403禁止 HTTP客户端错误状态响应代码表示服务器理解该请求,但拒绝对其进行授权
此状态类似于,但在本例中,重新身份验证不会产生任何影响。访问被永久禁止,并与应用程序逻辑相关联,例如对资源的权限不足理由 我在您的代码块中没有看到任何这样的问题。但是,有可能检测到WebDriver控制的浏览器客户端,因此后续请求被阻止,并且可能存在以下多种因素:
用户代理
插件
语言
WebGL
浏览器功能
缺少图像
解决方案 一般的解决方案是使用代理或旋转代理 您可以在中找到详细的讨论
奥特罗 您可以在以下网站上进行一些相关讨论:
- 也有同样的问题,用户代理是我的问题(请在此处阅读更多信息:)
此外,还可以检查您的网站上允许哪些请求方法,您可以通过查看Chrome中“网络”选项卡中的任何端点来实现这一点。它应该列出允许的请求方法,在我的例子中,我不能使用“HEAD”,但使用了“GET”
代码:
List links=driver.findElements(按.tagName(“a”));
布尔brokenLink=false;
用于(WebElement链接:链接){
字符串url=link.getAttribute(“href”);
HttpURLConnection conn=(HttpURLConnection)新URL(URL).openConnection();
conn.setRequestMethod(“GET”);
conn.setRequestProperty(“内容类型”、“应用程序/json”);
conn.setRequestProperty(“用户代理”,
“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/65.0.3325.181 Safari/537.36”);
连接();
int httpCode=conn.getResponseCode();
如果(httpCode>=400){
System.out.println(“断开的链接:+url+”+httpCode);
brokenLink=true;
Assert.assertFalse(brokenLink);
}
否则{
System.out.println(“工作链接:+url+”+httpCode);
}
}
是否有解决此问题的方法更新了答案。如果您有任何疑问,请告诉我。这可能会有所帮助
List<WebElement> links = driver.findElements(By.tagName("a"));
boolean brokenLink = false;
for (WebElement link : links) {
String url = link.getAttribute("href");
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
conn.connect();
int httpCode = conn.getResponseCode();
if (httpCode >= 400) {
System.out.println("BROKEN LINK: " + url + " " + httpCode);
brokenLink = true;
Assert.assertFalse(brokenLink);
}
else {
System.out.println("Working link: " + url + " " + httpCode);
}
}