Что нового

[Данные, строки] Проверка текстовой строки в поле ввода

BlagoYar

Русь Великая, Очнись! Поднимись с колен Родная!
Сообщения
64
Репутация
-1
Есть программа, в которой открывается окно с запросом открытия файла.
В эту строку мне нужно вставить определённый текст.
Его я вставляю через "^v", при этом иногда случается, что если программа слега подвисла, вставляется просто "v", а не текст из буфера обмена (это другая тема, но ...).

Задача - можно ли сделать проверку на 100% совпадение с нужным текстом?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
ControlSend
 
Автор
BlagoYar

BlagoYar

Русь Великая, Очнись! Поднимись с колен Родная!
Сообщения
64
Репутация
-1
joiner [?]
Тоже пробовал
Вместо "v" просто пустая строка (при том же самом небольшом подвисании). Пробовал и задержку добавлять.

ПС. Но это, как я говорил - это другая тема. Более важно, чтобы можно было её проверить, а потом нажимать открыть, тогда сбоев не будет.


Добавлено:
Сообщение автоматически объединено:

xXx [?]
Окно окну рознь.
Ну это понятно, но всё же - можно ли проверить как-нибудь строку на совпадение (она всё время не меняется) в поле ввода?

ПС. Поле ввода имеет клас "Edit"
Все данные из Autoit_Info
Код:
>>>> Window <<<<
Title:	Открыть
Class:	#32770
Position:	376, 172
Size:	625, 434
Style:	0x96CC02C4
ExStyle:	0x00010101
Handle:	0x00000000000916CE

>>>> Control <<<<
Class:	Edit
Instance:	1
ClassnameNN:	Edit1
Name:	
Advanced (Class):	[CLASS:Edit; INSTANCE:1]
ID:	1148
Text:	
Position:	204, 338
Size:	172, 15
ControlClick Coords:	54, 6
Style:	0x54000080
ExStyle:	0x00000000
Handle:	0x000000000009169C

>>>> Mouse <<<<
Position:	640, 544
Cursor ID:	0
Color:	0x535353
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
БлагоѨръ [?]
чтобы можно было её проверить, а потом нажимать открыть
Код:
Run("notepad.exe")
$hWnd = WinWaitActive("[class:Notepad]")
WinMenuSelectItem($hWnd, "", "&Файл", "&Открыть...")

; -------------------------------

$hOpen = WinWaitActive("Открыть")
$sText = "C:\Windows\win.ini"
For $i = 0 To 200
  ControlSetText($hOpen, "", "Edit1", $sText)
  Sleep(11)
  If ControlGetText($hOpen, "", "Edit1") = $sText Then ExitLoop
Next
If $i = 201 Then Exit MsgBox(0, "Err", "Проблема ввода текста")

; Send("{enter}")
 
Автор
BlagoYar

BlagoYar

Русь Великая, Очнись! Поднимись с колен Родная!
Сообщения
64
Репутация
-1
InnI
Хммм ... Ты вроде как не внимательно прочитал топик, потому как мне нужно не в редакторе это проверить, а в поле ввода открытия файла.

ПС. Если сравнивать с вэб-разметкой, то мне нужно не textarea, а input проверить.
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
OffTopic:
БлагоѨръ сказал(а):
Если при испытании не сработает, то уберите мягкий знак в слове "Открыть".
(У меня на Win10 - окно называется "Открытие")
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
xXx [?]
У меня на Win10 - окно называется "Открытие"
А у него, по данным Au3Info, окно называется "Открыть" ;)

Это "камень в огород" по поводу невнимательного чтения :whistle:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Ещё можно (и даже нужно) проверять принадлежность окна к нужному процессу (или главному окну), и затем проверять на видимость поля...

Код:
Opt('WinWaitDelay', 0)

$iPID = Run('notepad.exe')
$hWnd_Notepad = _WinWaitByPID($iPID, '', True, 5)
If @error Then Exit MsgBox(48, @ScriptName, 'Error to open notepad')

ControlSend($hWnd_Notepad, '', '', '^o')
$hWnd_Open = _WinWaitByPID($iPID, '[CLASS:#32770]', True, 5)
If @error Then Exit MsgBox(48, @ScriptName, 'Error while waiting for "Open" window')

$hEdit = ControlGetHandle($hWnd_Open, '', 'Edit1')

While Not BitAND(WinGetState($hEdit), 2)
	Sleep(10)
WEnd

$sText = 'C:\Windows\win.ini'

Do
	ControlSetText($hWnd_Open, '', $hEdit, $sText)
Until ControlGetText($hWnd_Open, '', $hEdit) = $sText

ControlClick($hWnd_Open, '', 'Button1')

Func _WinWaitByPID($iPID, $sTitle = '', $bVisible = True, $iTimeout = 0)
	Local $aWins, $iTimer = TimerInit()
	
	While 1
		If $sTitle Then
			$aWins = WinList($sTitle)
		Else
			$aWins = WinList()
		EndIf
		
		For $i = 1 To $aWins[0][0]
			If WinGetProcess($aWins[$i][1]) = $iPID And (Not $bVisible Or ($bVisible And BitAND(WinGetState($aWins[$i][1]), 2))) Then
				Return $aWins[$i][1]
			EndIf
		Next
		
		If $iTimeout And TimerDiff($iTimer) >= ($iTimeout * 1000) Then
			ExitLoop
		EndIf
		
		Sleep(10)
	WEnd
	
	Return 0
EndFunc
 
Автор
BlagoYar

BlagoYar

Русь Великая, Очнись! Поднимись с колен Родная!
Сообщения
64
Репутация
-1
БлагоДарю CreatoR, это будет как раз то, что нужно и из-за чего обратился вообще на форум. Позже испытаю
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
CreatoR [?]
проверять на видимость поля
Если проверять, то не на видимость, а на доступность, т.к. ControlSetText() может установить текст даже в заблокированный Edit.

Но ещё лучше проверять "полный цикл": наличие, видимость, доступность, как это делают фрэймворки автоматизированного тестирования.
Примерно так (первые три параметра аналогичны Control* функциям, последний - время ожидания в секундах)
Код:
Func ControlWait($WndTitle, $WndText, $Ctrl, $WaitTime = 3)
  If Not WinWait($WndTitle, $WndText, $WaitTime) Then _
    Return SetError(1, ConsoleWrite("!> Окно не найдено: '" & $WndTitle & "', '" & $WndText & "'" & @CRLF), 0)
  Local $Timer = TimerInit(), $Err = 0
  While Not ControlCommand($WndTitle, $WndText, $Ctrl, "IsVisible")
    $Err = @error
    If $WaitTime > 0 And TimerDiff($Timer) > $WaitTime * 1000 Then
      If $Err Then
        Return SetError(2, ConsoleWrite("!> Элемент не найден: '" & $WndTitle & "', '" & $WndText & "', '" & $Ctrl & "'" & @CRLF), 0)
      Else
        Return SetError(3, ConsoleWrite("!> Элемент не виден: '" & $WndTitle & "', '" & $WndText & "', '" & $Ctrl & "'" & @CRLF), 0)
      EndIf
    EndIf
    Sleep(11)
  WEnd
  While Not ControlCommand($WndTitle, $WndText, $Ctrl, "IsEnabled")
    If $WaitTime > 0 And TimerDiff($Timer) > $WaitTime * 1000 Then _
      Return SetError(4, ConsoleWrite("!> Элемент заблокирован: '" & $WndTitle & "', '" & $WndText & "', '" & $Ctrl & "'" & @CRLF), 0)
    Sleep(11)
  WEnd
  Return ControlGetHandle($WndTitle, $WndText, $Ctrl)
EndFunc


Код:
Run("notepad.exe")
$hWnd = WinWaitActive("[class:Notepad]")
WinMenuSelectItem($hWnd, "", "&Файл", "&Открыть...")

; -------------------------------

$hOpen = WinWaitActive("Открыть")
$sText = "C:\Windows\win.ini"
$hEdit = ControlWait($hOpen, "", "Edit1")
If Not $hEdit Then Exit
For $i = 0 To 100
  ControlSetText($hOpen, "", $hEdit, $sText)
  Sleep(11)
  If ControlGetText($hOpen, "", $hEdit) = $sText Then ExitLoop
Next
If $i = 101 Then Exit MsgBox(0, "Err", "Проблема ввода текста")

; Send("{enter}")
 
Верх