selenium 自动登录与分页抓商品urldemo

146 阅读1分钟
public static void main(String[] args) throws IOException, TesseractException, InterruptedException {
    System.setProperty("webdriver.chrome.driver","D:\\driver\\chromedriver_win32\\chromedriver.exe");
    WebDriver driver=new ChromeDriver();
    File file=new File(OciUtils.imgPath,"38-HN.jpg");
    String userName="4301025320";
    String passWord="12345678";
    String url="http://b2bsale.bbg.com.cn/views/business/goods_search.xhtml?cateId=500201&cataLevel=3&fullCode=.50.5002.500201.";
    driver.get("http://b2bsale.bbg.com.cn/login.xhtml");
    driver.manage().window().maximize();//设置浏览器最大化
    String code = getCode(driver, file);
    System.out.println(code);
    WebElement user = driver.findElement(By.id("loginForm:user"));
    WebElement psd = driver.findElement(By.id("loginForm:psd"));
    WebElement verifyCode = driver.findElement(By.id("loginForm:verifyCode"));
    setAttribute(user,driver,"value",userName);
    setAttribute(psd,driver,"value",passWord);
    setAttribute(verifyCode,driver,"value",code);
    WebElement login = driver.findElement(By.id("loginForm:loginBtn"));
    login.click();
    Thread.sleep(3000);
    driver.get(url);
    Thread.sleep(2000);
    WebElement li = driver.findElement(By.cssSelector(".u-pagination-centered > li:last-child"));
    Integer pageTotal=getPageTotal(li.getText());
    Integer pageNo=1;
    while (pageNo<pageTotal){
        WebElement pageNoElement = driver.findElement(By.cssSelector(".no-border-left > span"));
        pageNo=Integer.parseInt(pageNoElement.getText());
        System.out.println(pageNo);
        List<WebElement> elements = driver.findElements(By.className("m-produce-list-info"));
        for (WebElement element : elements) {
            WebElement urlElement = element.findElement(By.tagName("a"));
            System.out.println(urlElement.getAttribute("href"));
            System.out.println(getProductCode(urlElement.getAttribute("href")));
        }
        if(pageNo<pageTotal){
            WebElement nextElement = driver.findElement(By.id("goods-info-form:j_idt281"));
            nextElement.click();
            Thread.sleep(1000);
        }
    }
}
public static String getProductCode(String s){
    String startStr="code=";
    int index = s.indexOf(startStr);
    return s.substring(index+startStr.length());
}
public static int getPageTotal(String result){
    char[] chars = result.toCharArray();
    StringBuilder sb=new StringBuilder();
    int numberIndex=-1;
    for (int i = 0; i < chars.length; i++) {
        if(chars[i]>='0' && chars[i]<='9'){
            if(numberIndex==-1 && chars[i]=='0'){
                continue;
            }
           numberIndex=i;
           sb.append(chars[i]);
        }else if(numberIndex!=-1){
            break;
        }
    }
    return Integer.parseInt(sb.toString());
}
public static void setAttribute(WebElement e, WebDriver d, String attributeName, String value) {
    JavascriptExecutor js = (JavascriptExecutor) d;
    // 执行JavaScriptdiamante修改页面元素属性。arguments[0]-[2]后面会用e,attributeName,value替换并执行
    js.executeScript("arguments[0].setAttribute(arguments[1],arguments[2])", e, attributeName, value);
}
public static void setText(WebElement e, WebDriver d, String value){
    JavascriptExecutor js = (JavascriptExecutor) d;
    js.executeScript("arguments[0].value= arguments[1]", e, value);
}

public static String getCode(WebDriver driver ,File file) throws IOException, TesseractException, InterruptedException {
    String code=null;
    String matche="\\d{4}";
    while (code==null || !Pattern.matches(matche,code)){
        WebElement element = driver.findElement(By.cssSelector("span > img"));
        if(code!=null){
            WebElement element1=driver.findElement(By.id("loginForm:j_idt21"));
            element1.click();
            Thread.sleep(1000);
            element=driver.findElement(By.cssSelector("span > img"));
        }
        notFullScreen(driver,element,file);
        code = OciUtils.getImageInteger(file,true,0.5,0.79);
        System.out.println(code);
    }
    return  code;
}
public static void notFullScreen(WebDriver driver,WebElement element,File file)  {
    File screen = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    BufferedImage read = null;
    try {
        read = ImageIO.read(screen);
        int height = element.getSize().getHeight();
        int width = element.getSize().getWidth();
        java.awt.Rectangle rect = new java.awt.Rectangle(width, height);
        Point p = element.getLocation();
        //返回由指定的矩形区域定义的子图像
        BufferedImage img = read.getSubimage(p.getX(), p.getY(), rect.width, rect.height);
        //使用支持给定格式的BufferedImage写入图像到 File
        ImageIO.write(img, "png", screen);
        FileUtils.copyFile(screen,file);
    } catch (IOException e) {
        e.printStackTrace();
    }

}