Что нового

Как узнать индекс ссылки?

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Код:
_IELinkClickByIndex()


А как собственно узнать этот индекс???

На странице множество ссылок вида:

<A class="класс" onclick="do_ajax('ссылка', 'content'); return false;" href="полная_ссылка">Выполнить</A>

И будет ли равносильно _IELinkClickByIndex выполнение такого кода?
Код:
_IENavigate($oIE, 'полная_ссылка')
 

Sp01LeR

Знающий
Сообщения
45
Репутация
12
Mr. Anderson сказал(а):
А как собственно узнать этот индекс???

Собственно, для этого надо чуток внимательней курить мануал: :smile:

Код:
#include <IE.au3>
#include <Array.au3>
Dim $link_arr[1]
$oIE = _IE_Example ("basic")
$oLinks = _IELinkGetCollection ($oIE)
$link_arr[0] = @extended
MsgBox(0, "Link Info", $link_arr[0] & " links found")

For $oLink In $oLinks
    _ArrayAdd($link_arr, $oLink.href)
Next
_ArrayDisplay($link_arr, "Links:")
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Sp01LeR, спасибо, в таком случае второй вопрос первого поста становится более актуальным ввиду его меньшей сложности.
 

Sp01LeR

Знающий
Сообщения
45
Репутация
12
Если в ссылке не присутствует обработчик события (onclick="do_ajax('ссылка', 'content'); return false;") и если в коде нет ява-скриптовой проверки на событие клика - то почти во всех случаях _IENavigate() будет равносильно _IELinkClickByIndex().
Правда, есть одно "НО" - при _IENavigate() не будет передаватся реферер страницы...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Mr. Anderson [?]
в таком случае второй вопрос первого поста становится более актуальным ввиду его меньшей сложности.
Индекс любого тега, в HTML документе, это всего лишь порядковый номер этого тега в коллекции.
Код:
#include <IE.au3>

$oIE = _IECreate ("http://ya.ru")
$oLinks = _IELinkGetCollection ($oIE)
$iCount = @extended

For $i = 0 To $iCount
    If $i = 1 Then
		ConsoleWrite("All indexes of links on page: [" & $iCount & "]" & @CRLF)
		ConsoleWrite("Index: [" & $i & "] " & $oLinks.item($i).href & @CRLF)
		_IELinkClickByIndex($oIE,$i)
	EndIf
Next
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Sp01LeR, а можно в двух словах, что такое рефер?

Garrett, есть какой то способ узнать по какой именно ссылке мне надо жать? Я могу определить какая по счету ссылка "Выполнить" мне нужна, значит надо посчитать все предыдущие ссылки? Типа:
Код:
UBound(StringRegExp(_IEDocReadHTML($oIE), '(?s)(?i)<a.+?>.+?</a>', 3))
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Mr. Anderson [?]
есть какой то способ узнать по какой именно ссылке мне надо жать?
Можете проверять нужное слово в ссылке: <а>нужное слово</а> или, по атрибутам тега <a>: id, class, name.
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Garrett, да я имел ввиду как узнать id этой ссылки =)
 

Sp01LeR

Знающий
Сообщения
45
Репутация
12
Mr. Anderson сказал(а):
а можно в двух словах, что такое рефер?

Заголовок, который отправляет браузер при нажатии на ссылку(кнопку). Если например на странице http://сайт.ру/index.html нажали ссылку http://сайт.ру/page.html,
то браузер при переходе отправит заголовок:
Код:
Referer: http://сайт.ру/index.html

На некоторых сайтах могут проверять реферер - это типа такая защита от ботов. :smile:

Mr. Anderson сказал(а):
есть какой то способ узнать по какой именно ссылке мне надо жать?

Если в ссылке 100% не меняется анкор, то тогда:

Код:
_IELinkClickByText ($oIE, "текст ссылки")


Если есть id или name, то:

Код:
_IEGetObjById ($oIE, "нужный id")
_IEGetObjByName ($oIE, "нужный name")


Если есть class или title, то:
Код:
#include <IE.au3>
$oIE = _IE_Example ("basic")
$oLinks = _IELinkGetCollection ($oIE)
;==========================CLASS===============================
For $oLink In $oLinks
    If $oLink.class == "нужный class" Then _IEAction ($oLink, "click")
    ExitLoop
Next
;============================TITLE============================
For $oLink In $oLinks
    If $oLink.title == "нужный title" Then _IEAction ($oLink, "click")
    ExitLoop
Next


Если анкор меняется, и пареметров id, class, name, title нет, то тогда по индексу:

Код:
_IELinkClickByIndex ($oIE, 2)


Но индекс может менятся(например добавилось кол-во ссылок) тогда единственный вариант - кликать по адресу ссылки:
Код:
#include <IE.au3>
$oIE = _IE_Example ("basic")
$oLinks = _IELinkGetCollection ($oIE)
For $oLink In $oLinks
    If $oLink.href == "http://сайт.ру/page.html" Then _IEAction ($oLink, "click")
    ExitLoop
Next
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Mr. Anderson [?]
Garrett, да я имел ввиду как узнать id этой ссылки =)

Если вы работаете с исходным текстом _IEDocReadHTML то скорее всего так:
Код:
#include <IE.au3>

$oIE = _IECreate ("http://ya.ru")
$aLinks = StringRegExp(_IEDocReadHTML($oIE), '(?s)(?i)<a.+?>.+?</a>', 3) ; Index: [1] <A onclick=c(this,17,1080) href="http://mail.yandex.ru">Войти в почту</A>

For $i = 0 To UBound($aLinks)-1
    If StringRegExp($aLinks[$i], 'Войти в почту', 0) Then
		ConsoleWrite("Index: [" & $i & "] " & @CRLF)
		_IELinkClickByIndex($oIE,$i)
	EndIf
Next
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Garrett, спасибо, пользуюсь твоим кодом, но вот ошибка возникла:
Код:
--> IE.au3 V2.4-0 Warning from function _IELinkClickByIndex, $_IEStatus_NoMatch

Код такой:
Код:
Func Click($var)
	$sTextToSearch = StringRegExp($var, '(?s)(?i)<a.+?>.*?</a>', 1)
	$aLinks = StringRegExp(ContentPage(), '(?s)(?i)<a.+?>.*?</a>', 3)
	
	For $i = 0 To UBound($aLinks)-1
		
		If StringInStr($aLinks[$i], $sTextToSearch[0]) Then
			_IELinkClickByIndex($oIE, $i)
		EndIf
		
	Next
EndFunc


Что-то совсем ничего не понимаю... В справке вот что написано:
Код:
Remarks
Not all elements that appear to be links actually are. It is common practice to attach onClick JavaScript events to other DOM elements to simulate the behavior of links. To activate such elements, use "click" with _IEAction.

Что я перевожу примерно так:
Код:
Не все элементы, которые кажутся ссылками, на самом деле ими являются. Часто практикуют прикрепление Click JavaScript к другим  DOM элементам для того чтобы подделать вид ссылки. Чтобы активировать такие элементы, используйте "click" с _IEAction

Подскажите, пожалуйста, как им пользоваться! По справке я не понял.. Хм... почитал справку:
Код:
$oSubmit = _IEGetObjByName ($oIE, "submitExample")
_IEAction ($oSubmit, "click")


То есть наверное есть что то вроде _IEGetObjById, нашел в справке, ушел тестировать =)

Только вот вопрос, будет ли работать такой клик если запускать окно IE в фоне?

Все равно та же ошибка :(
Код:
$oSubmit = _IEGetObjById($oIE, $i)
_IEAction ($oSubmit, "click")


Код:
Index: [42] 
--> IE.au3 V2.4-0 Warning from function _IEGetObjById, $_IEStatus_NoMatch (42)
--> IE.au3 V2.4-0 Error from function _IEAction, $_IEStatus_InvalidDataType
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
А ссылки вида <A href="#"></А> считаются в индексе?
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Методом многочисленных проб и ошибок (4 часа :( ) понял вот что, в индекс ссылки не учитываются ссылки с картинками, или на другие серваки, по крайней мере у меня не учитывалась такая ссылка:
Код:
<a href="http://www.adobe.com/go/getflash">
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Загрузить Adobe Flash Player" />
</a>
P.S. Извиняюсь за кодировку
 

vcomp71

Осваивающий
Сообщения
431
Репутация
25
А вот в ссылке есть конструкция типа
<A onclick="return Friends.inviteToGroup(event, 25650694, 1192207, 0, 'dc3e8b441edddcfc76')" href="">Выслать приглашение</A>
Как вот эту часть строки получить?
onclick="return Friends.inviteToGroup(event, 25650694, 1192207, 0, 'dc3e8b441edddcfc76')"
Преребираем ссылки

Код:
For $oLink In $oLinks
    $i=$i+1
	$name = $oLink.innerHtml
	$hh = $oLink.href
Next

Но вот такая конструкция
Код:
$oLink.onclick

ничего не дает. Как метод выдернуть? Надо как-то получить доступ ко всему тэгу текущей ссылки.
 
Верх