2016-12-08 8 views
0

Я работаю над проектом по очистке данных с веб-сайта электронной коммерции. Я пытаюсь реализовать его с помощью Casper.js. Я пытаюсь выполнить итерацию с помощью кнопок Nodelist of AngularMaterial, нажав на них, вы перейдете к новой странице/состоянию - моя цель - захватить созданный URL. Я борюсь с правильным увольнением события click на кнопках и делаю это итеративно. Вот что я получил до сих пор.Использование Casper.js для нажатия на кнопки

casper.start("http://store.com", function() { 
    this.echo(this.getTitle()); 
}); 

casper.waitForSelector('.md-card-image', function() { //Going to Home page and waiting for AJAX content to load 
    console.log('AJAX results loaded'); 
    this.echo(this.getTitle()); 
    var product = this.evaluate(function() { 
     return document.querySelector('html').outerHTML; 

    }) 

}) 



function goToDetails() { //Using querySelector to target the buttons I want to nav to. 
    var products = document.querySelectorAll('button.md-primary.md-button.md-hue-2.md-raised.md-ink-ripple'); 

    return products; 

} 

casper.then(function() { //Trying to access the first button, no luck =[ 
details = this.evaluate(goToDetails); 

this.echo("Second test"); 
console.log(details.length); //length of 30 - for 30 buttons. 
    if(casper.exists( "button.md-primary.md-button.md-hue-2.md-raised.md-ink-ripple" )){ 
     this.echo('found') 
    } 

    this.clickLabel('Details') 

    }) 

}); 
casper.then(function(){ 
    casper.waitForSelector('.image-large-preview', function(){ 
     casper.echo(casper.getCurrentUrl()); //im getting the proper URL here. 
    }) 
    this.back(); // going back to the home page 
}) 

Этого метод щелкает первую доступную кнопку, хватает URL, который он получает осуществлять навигацию, и возвращается на главную страницу. Мне нужно найти способ щелкнуть по всем кнопкам один за другим и захватить URL-адрес. В настоящее время пытается найти правильный способ настроить таргетинг на кнопки, Это разметка для одной из карт (из 30 на странице). Я пытаюсь настроить таргетинг на кнопку с классом «класс =» мкр-первичного мкр-Оттенок-2 мкр-рейз мкр-кнопочный мкр-чернильной пульсацией».

<div flex="33" flex-sm="50" flex-xs="50" layout="row" ng-repeat="product in resultsCtrl.products" class="layout-row flex-xs-50 flex-sm-50 flex-33" style=""> 
     <md-card flex="" ng-click="resultsCtrl.goToDetail(product)" ng-class="{ 'md-whiteframe-3dp': hover }" ng-mouseenter="hover = true" ng-mouseleave="hover = false" class="_md flex" role="button" tabindex="0"> 
      <img class="md-card-image" style="padding-top:10px"> 
      <div layout="row" layout-align="end center" ng-init="condition = resultsCtrl.getCondition(product)" class="label-row layout-align-end-center layout-row"> 
       <div ng-show="condition.isVisible" ng-class="{ grey: condition.labelColor, tiny: resultsCtrl.$mdMedia('xs') }" class="ui label ng-hide grey" aria-hidden="true">New</div> 
      </div> 
      <md-card-title> 

      </md-card-title> 
      <md-card-content> 
       <div layout="row" layout-align="end end" class="price-sizing layout-align-end-end layout-row"> 
        <div class="msrp results-msrp"> 

         <span class="value price-strikethrough"> 
         $249.99 
         </span> 
        </div> 
        <!----><div ng-if="product.products[0].retailPrice.amount"> 
         <div> 
          <span class="ui tiny statistic"> 
           <span class="value"> 
           $79.99 
           </span> 
          </span> 
         </div> 
        </div><!----> 
       </div> 

      </md-card-content> 
      <md-card-actions layout="column" class="layout-column"> 
       <button class="md-primary md-hue-2 md-raised md-button md-ink-ripple" type="button" ng-transclude="" ng-click="resultsCtrl.goToDetail(product)"><span>Details</span></button> 
      </md-card-actions> 
     </md-card> 
    </div> 
+0

Вы не можете нажать на DOM напрямую. Вот что говорит ошибка. Вам всегда нужно использовать либо селектор CSS, либо выражения XPath, которые соответствуют конкретному узлу, который вы хотите щелкнуть. Всегда есть выход. Некоторые из них легче других, но все зависит от вашей разметки, которую вы не показывали. –

ответ

1

Не совсем уверен, где проблема, но для замкового всех кнопок Проблемы это должно помочь:

... 

var buttons = casper.getElementsAttribute("button.md-primary.md-button.md-hue-2.md-raised.md-ink-ripple", 'id'); 
while (buttons.length > 0) { 
    button = buttons.pop(); 
    (function(button) { 
     casper.then(function() { 
      casper.echo("Button id is " + button); 
     }); 
     casper.then(function() { 
      casper.click("#" + button); 
     }); 
     casper.waitForSelector('.selector', function() { 
      casper.echo(casper.getCurrentUrl()); 
     }); 
    })(button); 
} 

... 

Другой проблема может быть то, что материал Ajax не загружен полностью Просто попробуйте со статической засадой или waitForResource
Иногда это делает Sence активировать Ajax.. -Контейнер для загрузки данных.

+0

Кнопки, на которые я пытаюсь настроить таргетинг, не имеют идентификаторов, я просто перехожу к этому длинному классу, потому что это селектор, который захватывает все кнопки, которые я хочу щелкнуть. Спасибо за кодовое блокирование, я изменил его так, что он нацелен на класс, но я не думаю, что он будет работать с селекторами классов. Скрипт запускается один раз, пока не дойдет до эха («Button id - это« + кнопка ») и перестает работать. – alee046

 Смежные вопросы

  • Нет связанных вопросов^_^