자바 Selenium 슬라이더 검증 해독

25938 단어 자바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;
           }
       }
    

    총결산
    재미있다!!!

    좋은 웹페이지 즐겨찾기