如题,我试过selenium,并且运用得比较成熟,但对一些复杂的网页支持不太好。框架支持得不好,会经常自动关闭。
另外对于弹出窗口也支持得不好。例如,一个登陆页面,点登陆按钮登陆,那个网页会把老窗口关掉,而类似于弹出一个广告窗口来。这样selenium就不能获取新窗口了。我的需要是自动填写网页表单。点击提交表单,。获取网页里面的特定内容
我要自动填写的网页通常是比较复杂的页面,AJAX,JS,非常的复杂。
而且通常还是https的。找了N久也没有一个合适的。JDIC可以满足我的要求吗?HttpsURLConnection和HttpURLConnection似乎太复杂了。我用不来。而且似乎解决不了登陆验证码的问题不知道哪位大侠可以指条明路吗?我愿意付出报酬。希望有热心朋友帮助我,我的QQ:三八2646八八7

解决方案 »

  1.   

    selenium貌似不能支持多线程。我上次在自己机器开了个多线程提交,结果出js错误了不知道楼主有没有碰到过。
      

  2.   

    我没有试过多线程。我用selenium主要是两个问题,框架太慢,通常要等5~6秒。还有一个问题就是登陆表单,点登陆后,原窗口关闭,像弹广告一样弹出新窗口来,就获取不到新窗口了。
      

  3.   

    我的目的就是java控制IE浏览器,因为有些网站火狐打开。填写表单,点击提交按键,获取网页上特定的文字~!
      

  4.   

    htmlunit可以解决验证码吗?先读网页内容,把验证码的图片找出来,然后手动输入验证码再提交登陆表单?还有就是SSL安全链接有什么比较好的方式没有?
      

  5.   

    /*
     * checkresult.java
     *
     * Created on __DATE__, __TIME__
     */package design;import javax.swing.JOptionPane;import dealingdata.Account;
    import dealingdata.AccountDAO;/**
     *
     * @author  __USER__
     */
    public class checkresult extends javax.swing.JFrame { /** Creates new form checkresult */
    public checkresult() {
    initComponents();
    } /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    //GEN-BEGIN:initComponents
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();
    jLabel1 = new javax.swing.JLabel();
    jButton1 = new javax.swing.JButton();
    jButton2 = new javax.swing.JButton();
            jTable1.setModel(new javax.swing.table.DefaultTableModel(
             a, name));
    jScrollPane1.setViewportView(jTable1); jLabel1.setFont(new java.awt.Font("微软雅黑", 3, 36));
    jLabel1.setForeground(new java.awt.Color(0, 0, 204));
    jLabel1.setText("\u673a\u7968\u9884\u8ba2\u8868"); jButton1.setFont(new java.awt.Font("微软雅黑", 3, 24));
    jButton1.setForeground(new java.awt.Color(0, 0, 204));
    jButton1.setText("\u786e\u5b9a");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    cofirm(evt);
    }
    }); jButton2.setForeground(new java.awt.Color(0, 0, 255));
    jButton2.setText("\u663e\u793a\u6570\u636e");
    jButton2.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    showrecord(evt);
    }
    }); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(
    getContentPane());
    getContentPane().setLayout(layout);
    layout
    .setHorizontalGroup(layout
    .createParallelGroup(
    org.jdesktop.layout.GroupLayout.LEADING)
    .add(
    layout
    .createSequentialGroup()
    .add(
    layout
    .createParallelGroup(
    org.jdesktop.layout.GroupLayout.LEADING)
    .add(
    layout
    .createSequentialGroup()
    .add(
    148,
    148,
    148)
    .add(
    jLabel1)
    .addPreferredGap(
    org.jdesktop.layout.LayoutStyle.RELATED)
    .add(
    jButton2))
    .add(
    layout
    .createSequentialGroup()
    .add(
    57,
    57,
    57)
    .add(
    jScrollPane1,
    org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
    466,
    org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
    .add(
    layout
    .createSequentialGroup()
    .add(
    236,
    236,
    236)
    .add(
    jButton1)))
    .addContainerGap(120, Short.MAX_VALUE)));
    layout
    .setVerticalGroup(layout
    .createParallelGroup(
    org.jdesktop.layout.GroupLayout.LEADING)
    .add(
    layout
    .createSequentialGroup()
    .add(
    layout
    .createParallelGroup(
    org.jdesktop.layout.GroupLayout.LEADING,
    false)
    .add(
    layout
    .createSequentialGroup()
    .addContainerGap()
    .add(
    jLabel1)
    .addPreferredGap(
    org.jdesktop.layout.LayoutStyle.RELATED))
    .add(
    org.jdesktop.layout.GroupLayout.TRAILING,
    layout
    .createSequentialGroup()
    .addContainerGap(
    org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
    Short.MAX_VALUE)
    .add(
    jButton2)
    .add(
    17,
    17,
    17)))
    .add(
    jScrollPane1,
    org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
    299,
    org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
    .addPreferredGap(
    org.jdesktop.layout.LayoutStyle.RELATED,
    21, Short.MAX_VALUE).add(
    jButton1).add(27, 27, 27))); pack();
    }// </editor-fold>
    //GEN-END:initComponents private void showrecord(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    Account account=new Account();
    AccountDAO show=new AccountDAO();
    boolean result=show.loadInformation(account);

    if(result==true){
     jTable1.setModel(new javax.swing.table.DefaultTableModel(
             show.a, name)); JOptionPane.showMessageDialog(null,"恭喜您,操作成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
                     
    }
    else{
    JOptionPane.showMessageDialog(null, "对不起,无法显示结果", "提示", JOptionPane.ERROR_MESSAGE);
    }
    } private void cofirm(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    design.bookticket.main(null);
    } /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
    new checkresult().setVisible(true);
    }
    });
    } //GEN-BEGIN:variables
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    private Object[][] a=new Object[][]{{},{},{}}; 
    // End of variables declaration//GEN-END:variables
      
       public static Object name[]=new String[] { "姓名",
    "性别", "工作单位", "身份证号码","旅行时间","旅行目的地" };
    }
      

  6.   

    package dealingdata;public class Account {
       public static String name;
       public static Object sex;
       public static String workplace;
       public static String id;
       public static String time;
       public static String purpose;
       public static String accountid;
       public static String accountpwd;
       public static int balance;
       
       public Account(){
       
       }
    public Account(String name, String sex, String workplace, String id,
    String time, String purpose) {
    // TODO Auto-generated constructor stub
    this.name=name;
    this.sex=sex;
    this.workplace=workplace;
    this.id=id;
    this.time=time;
    this.purpose=purpose;
    }
    public Account(String accountid,String accountpwd){
    this.accountid=accountid;
    this.accountpwd=accountpwd;

    }
    public Account(int balance2){
    this.balance =balance2;
    }
    public Account(String accountid,String accountpwd,int balance){
    this.accountid=accountid;
    this.accountpwd=accountpwd;
    this.balance=balance;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public Object getSex() {
    return sex;
    }
    public void setSex(Object sex) {
    this.sex = sex;
    }

    public String getId() {
    return id;
    }
    public void setId(String id) {
    this.id = id;
    }
    public String getTime() {
    return time;
    }
    public void setTime(String time) {
    this.time = time;
    }
    public String getPurpose() {
    return purpose;
    }
    public void setPurpose(String purpose) {
    this.purpose = purpose;
    }
    public String getWorkplace() {
    return workplace;
    }
    public void setWorkplace(String workplace) {
    this.workplace = workplace;
    }
    public String getAccountid() {
    return accountid;
    }
    public void setAccountid(String accountid) {
    this.accountid = accountid;
    }
    public String getAccountpwd() {
    return accountpwd;
    }
    public void setAccountpwd(String accountpwd) {
    this.accountpwd = accountpwd;
    }
    public int getBalance() {
    return balance;
    }
    public void setBalance(int balance) {
    this.balance = balance;
    }
     
    }
      

  7.   

    package dealingdata;public interface dao {
    /** 将实例添加到数据库中 */
    boolean addAccount(Account account); /** 查询数据库中accounts表 */
    boolean loadAccount(Account account); /** 查询数据库中accounts表 */
    boolean loadBalance(Account account);
    /** 查询数据库中accounts表 */
    boolean loadManager(Manager manager); 
    /** 查询数据库中accounts表 */
    boolean loadInformation(Account account);
    /** 更新数据库中accounts表 */
    boolean updateBalance(Account account);
    /** 查询数据库中accounts表 */
    int BalanceIs(Account account);
    /** 将实例从数据库中删除 */
     boolean deleteAccount(Account account);}
    创建另一个java问件,代码如下:
    package dealingdata;import java.sql.*;import dealingdata.JdbcUtil;
    public class AccountDAO implements dao {
    private Connection con = null;
    private PreparedStatement ps = null;
    private ResultSet rs = null;
    private ResultSetMetaData md=null;
    public static Object[][] a;
    public static int lastNumber;
         private Statement sql;
        public AccountDAO() {
    } /** 将实例添加到数据库中,成功返回true,否则返回false */
    public boolean addAccount(Account account) {
    int result = -1;
    try {
    con = JdbcUtil.getConnection();// 获取连接
    con.setAutoCommit(false);// 将自动提交设置为false
    String sql = "insert into userinformation values(?,?,?,?,?,?)";
    ps = con.prepareStatement(sql);// 预编译语句
    String name = JdbcUtil.toISO(account.getName());
    String sex = account.getSex().toString();
    String workplace = JdbcUtil.toISO(account.getWorkplace());
    String id = JdbcUtil.toISO(account.getId());
    String time = JdbcUtil.toISO(account.getTime());
    String purpose = JdbcUtil.toISO(account.getPurpose());
    ps.setString(1, name);
    ps.setString(2, sex);
    ps.setString(3, workplace);
    ps.setString(4, id);
    ps.setString(5, time);
    ps.setString(6, purpose);
    result=ps.executeUpdate();
    con.commit();
           } catch (Exception e) {// 如果出现错误
    System.out.println(e);
    } finally {
    JdbcUtil.release(null, ps, con);
    }
    return result > 0;
    }
    /** 在数据库中查询实例,成功返回true,否则返回false */
    public boolean loadAccount(Account account) {
    boolean result=false;
    try {
    con = JdbcUtil.getConnection();// 获取连接
                    String sql="select * from accounts where accountid=? and accountpwd=?";
    ps = con.prepareStatement(sql);// 预编译语句
    String accountid=JdbcUtil.toISO(account.getAccountid());
    String accountpwd=JdbcUtil.toISO(account.getAccountpwd());
    ps.setString(1,accountid);//获取帐户id
        ps.setString(2,accountpwd);//获取帐户密码
        rs = ps.executeQuery();//执行语句
        con.commit();//提交
        if(rs.next()){
         return result=true;
        }
     } catch (Exception e) {// 如果出现错误
    System.out.println(e);
    } finally {
    JdbcUtil.release(null, ps, con);
    }
    return result;
    }
    /** 在数据库中查询实例,成功返回true,否则返回false */
    public boolean loadBalance(Account account) {
    boolean result=false;
    try {
    con = JdbcUtil.getConnection();// 获取连接
                    String sql="select * from accounts where balance>=?";
    ps = con.prepareStatement(sql);// 预编译语句
    int balance=account.getBalance();
    ps.setInt(1,balance);//获取账户余额
        rs = ps.executeQuery();//执行语句
        con.commit();//提交
        if(rs.next()){
         return result=true;
        }
     } catch (Exception e) {// 如果出现错误
    System.out.println(e);
    } finally {
    JdbcUtil.release(null, ps, con);
    }
    return result;
    }
    /** 在数据库中查询实例,成功返回true,否则返回false */
    public boolean loadManager(Manager manager) {
    boolean result=false;
    try {
    con = JdbcUtil.getConnection();// 获取连接
                    String sql="select * from manager where managerid=? and managerpwd=?";
    ps = con.prepareStatement(sql);// 预编译语句
    String managerid=JdbcUtil.toISO(manager.getManagerid());
    String managerpwd=JdbcUtil.toISO(manager.getManagerpwd());
    ps.setString(1,managerid);//获取帐户id
        ps.setString(2,managerpwd);//获取帐户密码
        rs = ps.executeQuery();//执行语句
        con.commit();//提交
        if(rs.next()){
         return result=true;
        }
     } catch (Exception e) {// 如果出现错误
    System.out.println(e);
    } finally {
    JdbcUtil.release(null, ps, con);
    }
    return result;
    }
    /** 在数据库中查询实例,成功返回true,否则返回false */
    public boolean loadInformation(Account account){
    boolean result =false;
    try {con = JdbcUtil.getConnection();// 获取连接
            sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
        rs=sql.executeQuery("select * from userinformation");
        rs.last();
        lastNumber=rs.getRow();
        a=new Object[lastNumber][6];
        int k=0;
        rs.beforeFirst();
        while(rs.next()){
        a[k][0]=rs.getString(1);
        a[k][1]=rs.getString(2);
        a[k][2]=rs.getString(3);
        a[k][3]=rs.getString(4);
        a[k][4]=rs.getString(5);
        a[k][5]=rs.getString(6);
        k++;
        }
       result=true; 
       } catch (Exception e) {// 如果出现错误
    System.out.println(e);
    } finally {
    JdbcUtil.release(null, ps, con);
    }
    return result;
    }
    public boolean updateBalance(Account account){
    boolean result=false;
    try{con = JdbcUtil.getConnection();// 获取连接
    ps = con.prepareStatement("update accounts set balance=? where accountid=? and accountpwd=?");// 预编译语句
    int balance=account.getBalance();
    String accountid=JdbcUtil.toISO(account.getAccountid());
    String accountpwd=JdbcUtil.toISO(account.getAccountpwd());
    ps.setInt(1,balance);//获取账户余额
    ps.setString(2,accountid);//获取帐户id
     ps.setString(3,accountpwd);//获取帐户密码
     ps.executeUpdate();
         con.commit();
      result=true;

    }catch (Exception e) {// 如果出现错误
    System.out.println(e);
    }finally {
    JdbcUtil.release(null, ps, con);
    }
    return result;
    }
    /** 在数据库中查询实例*/
    public int BalanceIs(Account account){
    int result=0;
    try{
    con = JdbcUtil.getConnection();// 获取连接
        String sql="select balance from accounts where accountid=? and accountpwd=?";
    ps = con.prepareStatement(sql);// 预编译语句
    String accountid=JdbcUtil.toISO(account.getAccountid());
    String accountpwd=JdbcUtil.toISO(account.getAccountpwd());
    ps.setString(1,accountid);//获取帐户id
     ps.setString(2,accountpwd);//获取帐户密码
     rs=ps.executeQuery();
     con.commit();
     while(rs.next()){
      result=rs.getInt(1);
     
     }
    con.close();
    }catch(Exception e){
    System.out.println(e);}
    return result;
    }
    /** 将实例从数据库中删除,成功返回true,否则返回false */
    public boolean deleteAccount(Account account) {
    int result = -1;
    try {
    con = JdbcUtil.getConnection();// 获取连接
    con.setAutoCommit(false);// 将自动提交设置为false
    String sql = "delete from userinformation where name=? and sex=? and workplace=? and id=? and time=? and purpose=?";
    ps = con.prepareStatement(sql);// 预编译语句
    String name = JdbcUtil.toISO(account.getName());
    String sex = account.getSex().toString();
    String workplace = JdbcUtil.toISO(account.getWorkplace());
    String id = JdbcUtil.toISO(account.getId());
    String time = JdbcUtil.toISO(account.getTime());
    String purpose = JdbcUtil.toISO(account.getPurpose());
    ps.setString(1, name);
    ps.setString(2, sex);
    ps.setString(3, workplace);
    ps.setString(4, id);
    ps.setString(5, time);
    ps.setString(6, purpose);
    result=ps.executeUpdate();
    con.commit();
       } catch (Exception e) {// 如果出现错误
    System.out.println(e);
    } finally {
    JdbcUtil.release(null, ps, con);
    }
    return result > 0;
    }}
    以上是我最近做完的课程设计的文见内容,有你需要的很多功能。
      

  8.   

    struts 都把这问题解决了,去用用把。
      

  9.   

    用jquery 吧。今天1.4都出来了。很强大的。