Что нового

Не получается нажать на кнопку JavaScript

JUSTICE

Новичок
Сообщения
4
Репутация
0
Доброго времени суток, форумчане!

Автоматизирую работу веб-страницы, требуется нажать на кнопку. Код вида:

Код:
<a class="btnv6_green_white_innerfade btn_medium" href="javascript:addToCart(44592);">
							<span>В корзину</span>
						</a>

Перерыл много схожих тем на форуме, но ни один из способов не дал результата. Буду рад любой помощи!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
JUSTICE,
Номер 44592 где-то еще указан? (В родительских тегах.)
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Можно попробовать исполнить js напрямую.
Вот примерно так:
Код:
#include <IE.au3>
$oIE = IECreate("ссылка")
; ...........
$oIE.document.parentWindow.execScript("addToCart(44592);")


Или получить коллекцию ссылок, перебрать ее и нажать на нужную:
Код:
#include <IE.au3>
$oIE = IECreate("ссылка")
; ...........
$lCol = _IELinkGetCollection($oIE)
For $item in $lCol
    If StringInStr($item.classname(), "btnv6_green_white_innerfade") and StringInStr($item.classname(), "btn_medium") then
        _IEAction($item, "click")
    EndIf
Next


Или объединить эти 2 метода:

Код:
#include <IE.au3>
$oIE = IECreate("ссылка")
; ...........
$lCol = _IELinkGetCollection($oIE)
For $item in $lCol
    If StringInStr($item.classname(), "btnv6_green_white_innerfade") and StringInStr($item.classname(), "btn_medium") then
        $oIE.document.parentWindow.execScript($item.href)
    EndIf
Next


Пока это все, что можно сказать.
Если Вам нужно нажимать не все кнопки подряд, а только избранные, нужно уточняющее условие. В таком случае будем разбирать по ходу дела.
 
Автор
JUSTICE

JUSTICE

Новичок
Сообщения
4
Репутация
0
madmasles сказал(а):
JUSTICE,
Номер 44592 где-то еще указан? (В родительских тегах.)
Фигурирует он ещё только в скрытой форме, перед кнопкой:
Код:
<form name="add_to_cart_44592" action="http://site.com/cart/" method="POST">
			<input type="hidden" name="snr" value="1_5_9__403">
			<input type="hidden" name="action" value="add_to_cart">
			<input type="hidden" name="sessionid" value="93725faa24d5ac8aabb84155">
			<input type="hidden" name="subid" value="44592">
		</form>

veretragna, ни один из предложенных примеров, к сожалению, не сработал - скрипт упорно не видит кнопку.
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Тогда забросьте сюда html-файл с этой кнопкой или просто ссылку на страницу. Я уверен, что, проинспектировав страницу, эту кнопку можно найти.
 
Автор
JUSTICE

JUSTICE

Новичок
Сообщения
4
Репутация
0
veretragna сказал(а):
Тогда забросьте сюда html-файл с этой кнопкой или просто ссылку на страницу. Я уверен, что, проинспектировав страницу, эту кнопку можно найти.
Возможность оставлять ссылки отключена, поэтому загрузил файл в архиве во вложения.
 

Вложения

  • page.zip
    24 КБ · Просмотры: 3

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Ок, завтра на свежую голову гляну.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
JUSTICE,
У меня так работает.
Код:
#include <IE.au3>

Local $sUrl = @ScriptDir & '\page.html', $oIE, $oLinks

Do
	$oIE = _IECreate($sUrl)
	$oLinks = _IETagNameGetCollection($oIE, 'a')
	If @error Then ExitLoop
	For $oLink In $oLinks
		If $oLink.ClassName == 'btnv6_green_white_innerfade btn_medium' Then
;~ 		If StringInStr($oLink.innerText, 'В корзину') Then
			ConsoleWrite($oLink.href & @LF)
			_IEAction($oLink, 'focus')
			ConsoleWrite('focus: ' & @error & @LF)
			_IEAction($oLink, 'click')
			ConsoleWrite('click: ' & @error & @LF)
			_IELoadWait($oIE)
			ExitLoop
		EndIf
	Next
Until 1
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Поддерживаю уважаемого madmasles, метод рабочий.
А можно еще и так:
Код:
#include <IE.au3>
Local $oIE, $lCol, $item

$oIE = _IECreate(@ScriptDir & '\page.html')
; ...........
$lCol = _IETagNameGetCollection($oIE, 'a') ; вместо _IELinkGetCollection($oIE)
For $item in $lCol
    If StringInStr($item.classname(), "btnv6_green_white_innerfade") and StringInStr($item.classname(), "btn_medium") then
        _IEAction($item, "click")
    EndIf
Next


Немного хочу уточнить. Лучше проверять классы элемента каждый отдельно с помощью StringInStr(), поскольку мы не знаем, какой класс может быть присвоен той или иной кнопке. Если вдруг нам отдадут страницу, на которой кнопка будет иметь еще какое-то свойство кроме btnv6_green_white_innerfade и btn_medium, проверка на полное совпадение:
Код:
If $oLink.ClassName == 'btnv6_green_white_innerfade btn_medium' Then

...не выдаст нам искомое.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
только не ClassName а className и сравнивать это лучше так String($oLink.className) = 'btnv6_green_white_innerfade btn_medium'
Ну и вообще странно перебирать коллекцию ссылок если есть готовый метод поиска по классу
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
inververs, поиск по классу не работает, если IE версии 8 или ниже (пруф: Справка). Когда я делал подобный скрипт и люди начали с ним работать, получил массу негатива и неприятных эмоций от пользователей XP и Висты.
UPD:
Хотя в итоге я забил на недовольных и сказал "не хотите обновлять систему - шагайте восвояси". С поиском по классу все работает намного быстрее.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
У меня сейчас вообще единственный метод поиска - это querySelector. Намного удобнее всего. Можно вообще забыть о переборе.
 
Автор
JUSTICE

JUSTICE

Новичок
Сообщения
4
Репутация
0
Не понимаю в чем дело, но код madmasles не приводит к нажатию на кнопку, а код veretragna вообще вылетает с ошибкой "Line 7 - For $item in $lCol^ ERROR - Error: Variable must be of type "Object".
Причем происходит это только в том случае, если я копирую код в отдельный скрипт. Если использую его как часть своего скрипта то эффект тот же - кнопка всё равно не нажимается...

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