Что нового

Заполнение формы с динамическим select'ом

beliy

Продвинутый
Сообщения
372
Репутация
72
Для IE функции раньше не приходилось писать, а тут сразу немного нестандартная задача. Нужна Ваша помощь...
Есть сайт у которого значения для select периодически меняется, также как и количество.
Пример кода необходимого блока:
Код:
<table>
						<tr>
							<th>
								URL:
							</th>

							<td>
								<input name="url" type="text" class="input-text" value="http://"/>
							</td>
						</tr>
						<tr>
							<th>
								Тип запроса:
							</th>
							<td>

							<select class="input-text" name="sel_count">
								<option value="8">type1</option>
								<option value="13">type2</option>
								<option value="34">type3</option>
								<option value="38">type4</option>
								<option value="49">type5</option>
                                                                 ...
							</select>
							</td>
						</tr>
						<tr>

							<th></th>
							<td>
								<input type="submit" class="input-button" value="Отправить запрос"/>
							</td>
						</tr>
					</table>

Пример GUI на который ориентируюсь:

Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 314, 167, 192, 124)
$Label1 = GUICtrlCreateLabel("URL:", 57, 42, 29, 17)
$Input1 = GUICtrlCreateInput("введите адрес сайта", 96, 39, 205, 21)
GUICtrlSetColor(-1, 0xC8C8C8)
$Label2 = GUICtrlCreateLabel("Тип запроса:", 15, 78, 71, 17)
$Combo1 = GUICtrlCreateCombo("Combo1", 96, 75, 202, 25); значение динамическое
$Button1 = GUICtrlCreateButton("Обработать запрос", 12, 114, 286, 40, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd


Как можно отпарсить select из html в $Combo1 скрипта и в зависимости от выбора в $Combo1 перенаправлять данные обратно на html форму ?
Заранее большое спасибо...
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
Сорь, добавил в 1 пост
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
1. получаешь доступ к select
2. внутри selecta обрабатываешь каждый option, т.е. получаешь текст $oOption.innetText
и добавляешь в Combo.
3. после того, как выбрал в скрипте, узнаешь индекс выбранного пункта.
4. используя этот индекс, получаешь доступ к нужному option'у.
5. используешь на нем функцию IEAction($oOption, "click")
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
kzru_hunter
...
5. А не лучше _IEFormElementOptionSelect() ?
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Попробуй так (с помощью StringRegExp):
Код:
#include <INet.au3>
#include <Encoding.au3>

$Form1 = GUICreate("Form1", 314, 167, 192, 124)
$Label1 = GUICtrlCreateLabel("URL:", 57, 42, 29, 17)
$Input1 = GUICtrlCreateInput("введите адрес сайта", 96, 39, 205, 21)
GUICtrlSetColor(-1, 0xC8C8C8)
$Label2 = GUICtrlCreateLabel("Тип запроса:", 15, 78, 71, 17)
$Combo1 = GUICtrlCreateCombo("", 96, 75, 202, 25)
$Button1 = GUICtrlCreateButton("Обработать запрос", 12, 114, 286, 40)
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case -3
            Exit
        Case $Button1
            $HTML = _INetGetSource(GUICtrlRead($Input1))
            $Reg = StringRegExp($HTML, '<option.*>(.*?)<', 3)
            For $i = 0 To UBound($Reg) -1
				$Encoding = _Encoding_CyrillicTo1251($Reg[$i])
                GUICtrlSetData($Combo1, $Encoding & '|')
            Next
    EndSwitch
WEnd
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
2 Zaramot
Пример не заработал. Также важное уточнение $Combo1 должен появиться при загрузке программы, а не при нажатии на кнопку...
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Также важное уточнение $Combo1 должен появиться при загрузке программы, а не при нажатии на кнопку...
Код:
#include <INet.au3>
#include <Encoding.au3>

$Form1 = GUICreate("Form1", 314, 167, 192, 124)
$Label1 = GUICtrlCreateLabel("URL:", 57, 42, 29, 17)
$Input1 = GUICtrlCreateInput("http://www.autoit-script.ru", 96, 39, 205, 21)
GUICtrlSetColor(-1, 0xC8C8C8)
$Label2 = GUICtrlCreateLabel("Тип запроса:", 15, 78, 71, 17)
$Combo1 = GUICtrlCreateCombo("", 96, 75, 202, 25)
$Button1 = GUICtrlCreateButton("Обработать запрос", 12, 114, 286, 40)
GUISetState()

$HTML = _INetGetSource(GUICtrlRead($Input1))
$Reg = StringRegExp($HTML, '<option.*>(.*?)<', 3)
For $i = 0 To UBound($Reg) -1
	$Encoding = _Encoding_CyrillicTo1251($Reg[$i])
	GUICtrlSetData($Combo1, $Encoding & '|')
Next

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case -3
            Exit
        Case $Button1

    EndSwitch
WEnd


Как не сработал ..... ? :blink:
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
к сожалению даже не парсит((
исходник того что успел набросать во вложении
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
получилось парсить немного другим способом, но вместо кириллици кракозябры. Сама страница на utf-8, пробовал в разных кодировках меняются лишь разнообразие кракозябр((
Вот рабочий код которым получилось парсить:
Код:
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET","http://2ip.ru/anonim/")
$oHTTP.Send()
$HTTPSource = $oHTTP.Responsetext
ConsoleWrite($HTTPSource)
$Reg = StringRegExp($HTTPSource , '<option.*>(.*?)<', 3)
For $i = 0 To UBound($Reg) -1
    $Encoding = _Encoding_CyrillicTo1251($Reg[$i])
    GUICtrlSetData($ip_cmb, $Encoding & '|')
Next
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
beliy,
я не зарегистрирован на 2ip.ru и страница anonim мне ничего не дает. Дадите тестовые логин и пароль, можно в ЛС, сделаю.
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
2 madmasles
для работы с сайтом не требуется регистрация, хотя через функцию _INetGetSource почемуто выдавало пустой результат.
Код с которым получилось парсить страницу без регистрации во вложении...
Кстати пишу оболочку браузера с функцией анонимайзера во первых удобно, во вторых интересно разобраться в новых для меня функциях. А норм оболочки браузера на Autoit, кстати, практически не существует - хотя его можно было бы адаптировать для многих целей. Если кому то еще интересно, то можно совместно довести это до ума...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
beliy [?]
для работы с сайтом не требуется регистрация
И правда не нужна, у меня все нормально работает, страны показывает так:
Код:
#include <Array.au3>

$s_Sourse = InetRead('http://2ip.ru/anonim/', 17)
$s_Sourse = BinaryToString($s_Sourse, 4)
$aCountry = StringRegExp($s_Sourse, '<option.*?\d+">(.*?)</option>', 3)
If @error Then Exit 100
_ArrayDisplay($aCountry)


PS
Через IE сделать?
 

madmasles

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

$sUrl = 'http://2ip.ru/anonim/'

$oIE = _IECreate($sUrl)
$oForm = _IEFormGetCollection($oIE, 1)
If @error Then Exit 1
$oSelect = _IEFormElementGetObjByName($oForm, 'anonimizer')
If @error Then Exit 2
$sHTML = _IEPropertyGet($oSelect, 'innerhtml')
If @error Then Exit 3
$aCountry = StringRegExp($sHTML, '(?i)<.*?>(.*?)<', 3)
If @error Then Exit 4
_ArrayDisplay($aCountry)
$oUrl = _IEFormElementGetObjByName($oForm, 'url')
If @error Then Exit 5
$iRand = Random(0, UBound($aCountry) - 1, 1)
ConsoleWrite('Country: ' & $aCountry[$iRand] & @LF)
_IEFormElementOptionSelect($oSelect, $aCountry[$iRand], 1, 'byText')
If @error Then Exit 6
_IEFormElementSetValue($oUrl, 'http://www.ip-ping.ru/')
If @error Then Exit 7
_IEFormSubmit($oForm)
If @error Then Exit 8
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
2 madmasles
Спасибо все работает, но если не затруднит можете навести пример на базе _IECreateEmbedded ()
Заранее благодарствую...
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
пример на базе _IECreateEmbedded ()
Так ?:
Код:
#include <IE.au3>
#include <Array.au3>

$sUrl = 'http://2ip.ru/anonim/'

$oIE = _IECreateEmbedded()
$GUI = GUICreate('', 800, 600)
$IEControl = GUICtrlCreateObj($oIE, 0, 0, 800, 600)
_IENavigate($oIE, $sUrl)
GUISetState()

$oForm = _IEFormGetCollection($oIE, 1)
If @error Then Exit 1
$oSelect = _IEFormElementGetObjByName($oForm, 'anonimizer')
If @error Then Exit 2
$sHTML = _IEPropertyGet($oSelect, 'innerhtml')
If @error Then Exit 3
$aCountry = StringRegExp($sHTML, '(?i)<.*?>(.*?)<', 3)
If @error Then Exit 4
_ArrayDisplay($aCountry)
$oUrl = _IEFormElementGetObjByName($oForm, 'url')
If @error Then Exit 5
$iRand = Random(0, UBound($aCountry) - 1, 1)
ConsoleWrite('Country: ' & $aCountry[$iRand] & @LF)
_IEFormElementOptionSelect($oSelect, $aCountry[$iRand], 1, 'byText')
If @error Then Exit 6
_IENavigate($oIE, 'http://www.ip-ping.ru/')

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
	EndSwitch
WEnd
 
Верх