2013-08-14 2 views
2

Я новичок в casperjs, и, насколько я узнал до сих пор, есть только два метода нажмите, которые могут вызвать действие мыши:casperjs, может потребоваться другой метод?

  • click() требует выбора
  • clickLabel() требует «ярлыка» между теги

Веб-сайт, с которым я сейчас имею дело, имеет динамические «вкладки», при нажатии каждой вкладки запускается javascript submit, нет никаких «классов», «id» или «label», связанных с каждой вкладкой , за исключением элемента "pic":

<a href="javascript:submitTab('search6')" tabindex="6"> 
    <img src="image6off.gif" name="imag6" height="6" hspace="0" vspace="0" border="0" onmouseover="nbGroup('over','imag6','image6on.gif','image6on.gif',1);" onmouseout="nbGroup('out');" onclick="nbGroup('down','group1','imag6','image6off.gif',1); submitTab('search6')" alt="New Search"> 
</a> 

Я попытался использовать clickLabel(), но не смог.

Да, я могу использовать XPath, однако проблема заключается в том, что количество вкладок динамическое в зависимости от доступной информации для каждой записи, поэтому в этом случае «новый поиск» может быть вкладкой 6 для этой записи, но вкладка 4 в другой , вкладка 8 в другой.

Да, я мог бы попытаться написать «петлю» для перебора всех доступных вкладок, потенциально, однако, если есть один метод щелчка который совмещает

waitForResource() 

, что было бы здорово, так как я может использовать «image6on.gif», чтобы сообщить программе, какой образ или вкладку щелкнуть, по-видимому, для этого веб-сайта, я узнал, что каждая отдельная программа вкладок javascript уникально связана с одним «image # on/off.gif»

Надеюсь, что какой-то вкладчик для casperjs может легко реализовать этот метод, чтобы справиться с такой ситуацией.

+0

Кстати, если есть другой способ обойти его, пожалуйста, научите меня, в частности, как нажать на конкретную вкладку, номер которой не связан с полем записи позади нее, но я хочу конкретную область записи, а не информацию № # вкладки, я надеюсь, что я достаточно конкретный – user2684276

+0

Большое спасибо за вашу работу по редактированию, rgettman – user2684276

ответ

3

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

casper.click("a[tabindex='6']"); 

Edit: Hack Я кинул вместе на основе свой комментарий ниже:

casper.thenEvaluate(function() { 
    var attr = document.querySelector('img[alt="New Search"]').parentNode.getAttribute('tabindex'); 
    __utils__.click('a[tabindex="' + attr + '"]'); 
}); 

casper.thenEvaluate() позволяет выполнять javascript на удаленной странице.

__utils__ вводится на каждую страницу, загружаемую в виде дополнительного набора функций, которые вы можете использовать.

+0

Прежде всего, большое спасибо за ваш ответ, "tabindex =" 6 "is не обязательно всегда связаны с «новым поиском», каждая вкладка имеет разную информацию, если я хочу нажать «новый поиск», вкладка «новый поиск» может быть tabindex = «6» для этой записи, а tabindex = «8» для следующий, поэтому я не могу использовать tabindex, чтобы убедиться, что я всегда буду нажимать «новый поиск», одна вещь, которую я узнал, это то, что изображение, связанное с вкладка «image # on/off.gif» уникально связана с контентом, например «новый поиск», поэтому, если бы я мог указать ресурс, который я нажимаю, проблема будет решена! – user2684276

+0

Обновлено так, что оно захватывает tabindex родителя изображения и затем нажимает на этот элемент. – hexid

+0

мой бог, так много гениев здесь, и кажется, что ничего не получается, спасибо вам огромное, hexid – user2684276

2

Я не являюсь автором CasperJS. С моей точки зрения, функция clickLabel уже слишком много. Я не могу вспомнить, что я действительно использовал его, потому что большую часть времени есть что-то, что предотвращает точное совпадение строк.

Вы правы, это действительный аргумент, чтобы добавить новую функцию клика в CasperJS. По-моему, лучше использовать предоставленную XPath возможность сделать это. Вы даже можете создать эту функцию для своего использования:

casper.clickByImg = function(imgRes){ 
    var x = require('casper').selectXPath; 
    this.click(x("//a/img[contains(@href,"+imgRes+")]/..")); 
    return this; 
}; 

См. Минимальные накладные расходы.

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

casper.clickByImgRegexp = function(regexp){ 
    var hrefs = this.getElementsAttribute("a > img", "href"); 
    for(var i = 0; i < hrefs.length; i++) { 
     if (hrefs[i].match(regexp)) { 
      this.clickByImg(hrefs[i]); 
      break; 
     } 
    } 
    return this; 
};