CasperJS, как обрабатывать деформированный HTML?

мне нужно автоматически загрузить файл на сайт клиента, сайт защищен учетными данными для входа. Теперь у меня действительно большая проблема, потому что страница входа в систему (и, возможно, остальная часть сайта ...) имеют искаженный HTML. Как я могу обрабатывать эти страницы? кажется, что casperJS не может обрабатывать искаженный HTML

ПРИМЕР искаженного HTML (это страница сайта немного подчищена, но исходные проблемы, такие как tr или td, не закрыты и т. д.):

<html>
    <head>
        <title>TEST Login Page</title>
    </head>
<body>
    <div>
        <table>
            <tbody>
                <tr>
                    <td>
                        <table>
                            <tbody>
                                <tr>
                                    <td>
                                        <table>
                                            <tbody>
                                            <tr>
                                                <td>
                                                    <table> 
                                                        <tbody>                                                     
                                                        <form name="loginForm" method="post" action="test.do">
                                                            <tr>                                    
                                                                <input type="username" name="username" size="12" value=""></td>
                                                                <input type="password" name="password" size="12" value=""></td>
                                                            <input type="submit" value="Login" class="submit"></td>
                                                        </tr>
                                                        </form>
                                                    <tr>
                                </tr>                               
                            </tbody>
                        </table>
                    </td>
                    </tr>
                </tbody>
                </table>
                </td>
            </tr>
        </tbody>
        </table>
        </td>
    </tr>
</tbody>
</table>
</div>
</body>
</html>

ЧИСТЫЙ HTML

!DOCTYPE html>
<html>
<head>
  <title>TEST Login Page</title>
</head>
<body>
  <div>
    <table>
      <tbody>
        <tr>
          <td>
            <table>
              <tbody>
                <tr>
                  <td>
                    <table>
                      <tbody>
                        <tr>
                          <td>
                            <form name="loginForm" method="post" action="test.do" id="loginForm">
                                <input type="username" name="username" size="12" value="" />
                                <input type="password" name="password" size="12" value="" />
                                <input type="submit" value="Login" class="submit" />
                            </form>
                          </td>
                        </tr>
                      </tbody>
                    </table>
                  </td>
                </tr>
              </tbody>
            </table>
          </td>
        </tr>
      </tbody>
    </table>
  </div>
</body>
</html>

Пример Casper JS:

casper.start(serverName, function(){ 
  this.echo(this.getHTML('form[name="loginForm"]'));
});

casper.run();

С искаженным кодом ничего не возвращается, но с очищенным кодом все работает нормально!

есть способ справиться с этой проблемой?


person Marco    schedule 12.08.2014    source источник
comment
Можете ли вы запустить код страницы через скрипт очистки html, прежде чем передать его в casperJS? Некоторые возможности здесь: stackoverflow.com/questions/ 3913355/ См. также этот вопрос: stackoverflow. ком/вопросы/21381549/   -  person i alarmed alien    schedule 12.08.2014
comment
Спасибо за ваш ответ, я уже пробовал этот способ, но я не могу привести в порядок HTML перед передачей его в движок casperJS, есть пример? ничего не могу найти в гугле :(   -  person Marco    schedule 12.08.2014
comment
Чтобы уточнить, вы пробовали метод во второй ссылке?   -  person i alarmed alien    schedule 12.08.2014
comment
МОЙ БОГ!! извините, второй пример работает точно так, как ожидалось! Большое спасибо !спасибо   -  person Marco    schedule 12.08.2014


Ответы (1)


Если HTML искажен, то не определено, как PhantomJS будет анализировать и обрабатывать его. PhantomJS полностью прерывает страницу (пример):

<table>
    <tbody>
        <tr>
            <td>
                <table>
                    <tbody>
                    <tr>
                        <td>
                            <input type="username" name="username" size="12" value=""><input type="password" name="password" size="12" value=""><input type="submit" value="Login" class="submit"><table> 
                                <tbody>                                                     
                                <form name="loginForm" method="post" action="test.do"></form>
                                    <tr>                                    



                                </tr>

                            <tr>
        </tr>                               
    </tbody>
</table>

Его еще можно спасти

  1. загрузка рассматриваемой страницы с помощью __utils__.sendAJAX,
  2. сначала исправить это с помощью простых операций javascript и строк (это сложная часть) и
  3. затем назначьте эту фиксированную строку casper.page.content.

По сути, это будет about:blank страница с вашей разметкой. Поэтому вам нужно будет запустить CasperJS с флагом --local-to-remote-url-access=true.


Если вы не привязаны к PhantomJS, вы можете попробовать http://slimerjs.org/ в качестве движка для CasperJS. Он использует движок gecko установленного Firefox, который может лучше обрабатывать поврежденный HTML. Его можно запустить в автономном режиме через xvfb.

person Artjom B.    schedule 12.08.2014