자바 Selenium 슬라이더 검증 해독
이틀 전에 재 미 있 는 도 구 를 발 견 했 습 니 다. Selenium 은 사람 을 모 의 해서 관광 기 를 조작 할 수 있 습 니 다. 빨리 쇠뿔 도 단 김 에 작은 demo 를 가지 고 놀 수 있 습 니 다. 슬라이더 는 현재 보편적으로 사용 되 고 있 습 니 다. 바로 로봇 인지 아 닌 지 를 검증 하기 위해 서 입 니 다. 하지만 이것 은 풀 수 있 고 제 가 흥미진진 하 게 이야기 하 는 것 을 들 을 수 있 습 니 다.
사고의 방향
전제 조건
Selenium 홈 페이지 jar 가방 다운로드, 환경 구축
첫 번 째 문 제 는 제 가 다른 블 로그 에서 현재 두 번 째 문제 인 데 어떻게 의인 화 된 슬라이더 를 끌 어 당 기 는 지 상세 하 게 설명 하 였 습 니 다. 너무 빨리 미 끄 러 지면 안 되 고 너무 느 려 도 안 됩 니 다. 여기 서 저 는 다른 사람 이 python 을 사용 하 는 방안 을 제공 합 니 다. 사용 할 수 있 습 니 다.
public static void move(WebDriver driver, WebElement element, Integer[] track)
throws InterruptedException {
Actions actions = new Actions(driver);
//
new Actions(driver).clickAndHold(element).perform();
for (int i : track) {
actions.moveByOffset(i, 0).perform();
}
Thread.sleep(500);
//
actions.release(element).perform();
}
//
public static Integer[] getTrack(int distance){
List<Integer> integers = new ArrayList<>();
// distance += 20;
int current = 0;
double mid = (distance * 3) / 4;
double t = 0.2;
double v = 0.0;
double v0 = 0;
double move = 0.0;
while (current < distance){
int a = 0;
if (current < mid){
a = 2;
}else {
a = -3;
}
v0 = v;
v = v0 + a * t;
move = v0 * t + (0.5) * a * t * t;
current += move;
integers.add((int) CommandUtil.round(move));
}
// integers.addAll(Stream.of(-3, -3, -2, -2, -2, -2, -2, -1, -3, -4).collect(Collectors.toList()));
return integers.toArray(new Integer[0]);
}
우리 가 계산 한 거리 가 반드시 매우 정확 한 것 은 아니 기 때문에, 우 리 는 다시 시도 할 수 있다.
//
int retryCount = 0;
int i = 0;
WebElement tcaptchaButtonEle = null;
while (true){
// 3 3 ,
if (retryCount % 3 == 0){
retryCount = 0;
//
tcaptchaButtonEle = webDriver.findElementById("tcaptcha_drag_thumb");
System.out.println(tcaptchaButtonEle.getAttribute("class"));
//
WebElement slideBgEle = webDriver.findElementById("slideBg");
String slideBgPicUrl = slideBgEle.getAttribute("src");
//
WebElement slideBlockEle = webDriver.findElementById("slideBlock");
String slideBlockPicUrl = slideBlockEle.getAttribute("src");
String style = slideBlockEle.getAttribute("style");
String[] split = style.split(";");
// html
double htmlBlockWidth = 0.0;
// html x
double marginLeft = 0.0;
for (String s : split) {
if (s.contains("width")){
String px = s.replace("width: ", "").replace("px", "");
htmlBlockWidth = Double.parseDouble(px);
}else if (s.contains("left")){
String px = s.replace("left: ", "").replace("px", "");
marginLeft = Double.parseDouble(px);
}
}
System.out.println(htmlBlockWidth + "," + marginLeft);
try {
// ( )
i = SlideUtils.calculateOffset(slideBgPicUrl, slideBlockPicUrl, htmlBlockWidth, marginLeft);
//
i -= 20;
} catch (Exception e) {
e.printStackTrace();
}
}else {
// , ,
// , ,
i -= 15;
}
Thread.sleep(1000);
System.out.println(" ==> "+ i);
Integer[] track = getTrack(i);
System.out.println(" ==> " + JSON.toJSONString(track));
move(webDriver, tcaptchaButtonEle, track);
Thread.sleep(1000);
WebElement guideText = null;
try {
// ,
// id
// ,
guideText = webDriver.findElementById("guideText");
} catch (Exception e) {
System.out.println(" ");
break;
}
// Thread.sleep(3000);
System.out.println(" ");
retryCount++;
}
//
webDriver.switchTo().parentFrame();
buttons = webDriver.findElementsByTagName("button");
for (WebElement button : buttons) {
String span = button.findElement(By.tagName("span")).getText();
//
if (span.equals(" ")){
button.click();
Thread.sleep(2000);
break;
}
}
총결산
재미있다!!!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.