Что нового

Как определить активность окна по ссылке в адресной строке ?

uritalex

Новичок
Сообщения
197
Репутация
3
Добрый вечер! В очередной раз обращаюсь к гуру :smile: Есть такая проблема: при выполнении определенного скрипта для Гугл Хрома (если нужно укажу, но по сути вопрос не в нем) необходимо проверить наличие окна с заданной ссылкой в адресной строке. Зачем это нужно? Отвечаю: дело в том что при разных странах, где используется скрипт, заголовок окна будет разным (переводится) заменить на постоянную не представляется возможным, а вот окно с этой ссылкой отловить нужно, так дальнейшее выполнение скрипта уже не продуктивно.

Через Инспект отловил что параметр: Value.Value соответствует тому что нужно найти. Как этот параметр привязать к WinExists или аналогу?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
uritalex
заменить на постоянную не представляется возможным
Такой вариант?
Код:
Opt("WinTitleMatchMode", 2)
WinSetTitle("- Google Chrome", "", "Constant Title")


Как этот параметр привязать
Код:
#include <UIAutomate.au3>

Opt("WinTitleMatchMode", 2)

$sURL = "autoit-script.ru"

$oParent = _UIA_GetElementFromHandle(WinGetHandle("- Google Chrome"))
$oElement = _UIA_GetControlTypeElement($oParent, $UIA_EditControlTypeId, $sURL, "Value.Value")
If IsObj($oElement) Then
  ConsoleWrite("Найден: " & _UIA_ElementGetPropertyValue($oElement, "Name") & @CRLF)
Else
  ConsoleWrite("Не найден" & @CRLF)
EndIf
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Поправьте если я понял неправильно :
Код:
#include <UIAutomate.au3>

Opt("WinTitleMatchMode", 2)

$sURL = "autoit-script.ru"

$oParent = _UIA_GetElementFromHandle(WinGetHandle("- Google Chrome")) : берет элементы с Хрома
$oElement = _UIA_GetControlTypeElement($oParent, $UIA_EditControlTypeId, $sURL, "Value.Value") : получает данные с  параметром Value.Value 
If IsObj($oElement) Then 
  ConsoleWrite("Найден: " & _UIA_ElementGetPropertyValue($oElement, "Name") & @CRLF) : здесь идет запись в консоль значение данных при их наличии Value.Value
Else
  ConsoleWrite("Не найден" & @CRLF) : здесь идет запись значения  в консоль данных при их при их отсутствии Value.Value
EndIf


А вод такая схема может отработать:
Код:
$Url1 = То что нужно отловить в адресной строке
$Url2 =
$Url* = 
If IsObj($oElement) Then 
  $Cwrite = ConsoleWrite("Найден: " & _UIA_ElementGetPropertyValue($oElement, "Name") & @CRLF)
If $Cwrite = $Url1 or $Cwrite = $Url2 or $Cwrite = $Url* Then ExitLoop


Как то так. Проверить пока не могу нет доступа к домашнему компу :(
И еще одно такое выражение :

Код:
WinExists( "---Google Chrome", "", "[CLASS:Chrome_OmniboxView]", "тут требуемая ссыль")

имеет место для существование? Возможно через него сделать проверку
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
uritalex
Поправьте если я понял неправильно
Код:
; создание объекта на основе окна Хрома (это весь Хром целиком)
$oParent = _UIA_GetElementFromHandle(WinGetHandle("- Google Chrome"))

; поиск во всём окне Хрома первого попавшегося элемента, у которого
; значение свойства "Value.Value" совпадает с $sURL
$oElement = _UIA_GetControlTypeElement($oParent, $UIA_EditControlTypeId, $sURL, "Value.Value")

; если элемент найден, то он будет объектом
If IsObj($oElement) Then
  ; просто для проверки выводим в консоль имя элемента-объекта
  ConsoleWrite("Найден: " & _UIA_ElementGetPropertyValue($oElement, "Name") & @CRLF)
Else
  ; просто для проверки выводим в консоль строку
  ConsoleWrite("Не найден" & @CRLF)
EndIf

такая схема может отработать
Нет. ConsoleWrite() вернёт число выведенных символов, которое никогда не будет равно "Тому, что нужно отловить в адресной строке".

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

пока не могу нет доступа
Не нужно спешить. Вы лучше один раз посмотрите, как это всё работает. Поэкспериментируйте. И вопросов станет меньше.
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Т.е. если на стадии
Код:
$oElement = _UIA_GetControlTypeElement($oParent, $UIA_EditControlTypeId, $sURL, "Value.Value")

условие выполняется то:
Код:
If IsObj($oElement) Then

будет равно значению 1 (т.е. предыдущее условие выполнено и найдено окно с требуемым адресом) и мы можем назначить дальнейшее условие ?
к примеру такое:
Код:
If IsObj($oElement) = "является объектом"  Then ExitLoop

Прошу прощения но в программировании не понимаю ничего :( так интуитивно подставляю, то что хоть как то могу понять :smile:
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Что то не идет у меня такое пробное :( :
Код:
#include <UIAutomate.au3>
Opt("WinTitleMatchMode", 2)
$sURL = "https://www.google.com.ua/search?q=gjbcr&oq=gjbcr&aqs=chrome..69i57j69i59j69i57l2j69i60j69i61.7332j0j1&sourceid=chrome&ie=UTF-8"
$oParent = _UIA_GetElementFromHandle(WinGetHandle("- Google Chrome"))
$oElement = _UIA_GetControlTypeElement($oParent, $UIA_EditControlTypeId, $sURL, "Value.Value")
If IsObj($oElement) Then WinClose($oParent)
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Согласен :( ввело в заблуждение WinGetHandle и полагал что по $oParent можно обратиться к окну. Внес исправления заработало :smile: теперь буду пробовать (пока сам) написать на соответствие по одной из 3 ссылок :smile:
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
uritalex
полагал что по $oParent можно обратиться к окну
Можно. Через свойства самого объекта.

буду пробовать (пока сам) написать
Похвально :beer:
Если будет плохо получаться - одно из решений под спойлером ;)
Код:
#include <UIAutomate.au3>

Opt("WinTitleMatchMode", 2)

Global $aURL[] = ["autoit-script.ru","www.yandex.ru","https://mail.ru"]

$oParent = _UIA_GetElementFromHandle(WinGetHandle("- Google Chrome"))
$oElement = _UIA_GetControlTypeElement($oParent, $UIA_EditControlTypeId, "OmniboxViewViews", "HelpText")
If IsObj($oElement) Then
  For $i = 0 To UBound($aURL) - 1
    If _UIA_ElementGetPropertyValue($oElement, "Value.Value") = $aURL[$i] Then
      WinClose("- Google Chrome")
      ExitLoop
    EndIf
  Next
EndIf
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Пока думал над функциями (засунуть скрипт в пользовательскую функцию) не удержался и подсмотрел спойлер ;D Я так понимаю это условие действует если в наличии одна из указанных ссылок?
Все разобрался :smile: спасибо теперь буду это пихать в функцию :smile:



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

Вот :smile: всунул я его все таки в функцию Но только чуток по другому: разбил каждое условие на отдельную функцию с выводом необходимого значения в уже готовый скрипт. Хоть и потратил на это 5 часов (пока мозги не закипели) Но результатом довольный :smile: единственное что у меня так и не получилось так это скрипт под спойлером засунуть в функцию, и при наличии указанных ссылок что б функция давала значение 1 . Но для самого себя все таки буду его дальше долбить пока не получится ;D


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

И я опять тут :( Скрипт с функциями отрабатывает хорошо, но только на той машине где были отловлены искомые ссылки. Бился я с этим бился пока не сравнил ссылки. И тут как раз и нашлась та ложка дегтя что портит всю картину, искомая ссылка на разных пк отличается буквально на 1-5 символов :( И соответственно возник вопрос: возможно ли назначить переменной $sURL не всю ссылку целиком (для поиска), а её часть? не
Код:
$sURL = "https://www.google.com.ua/search?q=gjbcr&oq=gjbcr&aqs=chrome..69i57j69i59j69i57l2j69i60j69i61.7332j0j1&sourceid=chrome&ie=UTF-8" 
а вод что то вроде 
$sURL = "https://www.google.com.ua/search?q=gjbcr&oq=gjbcr&aqs=*"

Чтоб переменная $sURL отрабатывала при наличии первой части адреса вне зависимости от дальнейших символов.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
uritalex
засунуть в функцию, и при наличии указанных ссылок что б функция давала значение 1
В функцию передаём строку и способ поиска. Если $fInStr = True (по умолчанию), то проверяется наличие строки в любом месте URL; если False, то проверяется полное соответствие строки и URL.
Код:
#include <UIAutomate.au3>

Opt("WinTitleMatchMode", 2)

; точное совпадение
$Result = URLexists("autoit-script.ru", False)
ConsoleWrite($Result & @CRLF)

; наличие текста в любом месте URL
$Result = URLexists("mail.ru")
ConsoleWrite($Result & @CRLF)



Func URLexists($sURL, $fInStr = True)
  Local $oParent = _UIA_GetElementFromHandle(WinGetHandle("- Google Chrome"))
  Local $oElement = _UIA_GetControlTypeElement($oParent, $UIA_EditControlTypeId, "OmniboxViewViews", "HelpText")
  If IsObj($oElement) Then
    If $fInStr Then
      If StringInStr(_UIA_ElementGetPropertyValue($oElement, "Value.Value"), $sURL) Then Return 1
    Else
      If _UIA_ElementGetPropertyValue($oElement, "Value.Value") = $sURL Then Return 1
    EndIf
  EndIf
  Return 0
EndFunc
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
OffTopic:
Мозги по стене
Спасибо буду думать дальше :stars:


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

Еще раз добрый день :smile: Спасибо за последний скрипт работает как нужно. Но, но опять нашлась ложка дегтя :( в стандартно установленном Гугл хром отрабатывает на ура. Но как только его пытаешься применить в портированной версии Хрома скрипт не отрабатывает :( указывает на то что данная функция : _UIA_GetControlTypeElement не нашла искомого значения :( Проверил Инспектом и действительно портированная версия Хрома не всегда (не на каждой вкладке/ссылке) отображает значения используемые в скрипте. Но еще более странно что скрипт поиска по точному совпадению и предыдущих постов отрабатывает нормально и при появлении ссылки в заданной вкладке выполняет соответствующие действия. Так что как то так. Один скрипт отрабатывает нормально (по точному совпадению) второй с выборкой по части вообще не может привязаться к окну :( Можно ли это как то решить
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
uritalex
в портированной версии Хрома
Это как? Вы под Линуксом работаете, что ли? Или вы имеете в виду портабельную (portable) версию?
Я проверяю на GoogleChromePortable 40.0.2214.111. Проблем не нахожу.

Во-первых, проверьте в Inspect значение свойства "HelpText" для панели адреса. Если оно не "OmniboxViewViews", то нужно привязываться к какому-то другому свойству.
Во-вторых, нужен конкретный порядок действий или набор определённых ссылок, чтобы повторить ситуацию. На ваше "Так что как то так" могу лишь ответить "Попробуйте как-нибудь по-другому" :smile:
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
И снова я :( вот что дает мне инспект : http://c2n.me/3ivaEem пробовал разные вариации значений и все без толку :( что с этого можно взять ?


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

:laugh: Все таки 3 бессонные ночи дали результат. Разобрался все заработало!!! :IL_AutoIt_1: Благодарю Вас за помощь и поддержку :beer:. Оказывается все лежало на поверхности, нужно просто вникнуть в суть самого процесса, проявить смекалку и пробовать, пробовать и еще раз пробовать.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
uritalex
что с этого можно взять
Скачал последнюю версию 43.0.2357.81 - значение свойства "HelpText" у неё пустое. А у вашей версии данного свойства вообще нет.
Ну и не надо. Возьмём другое (гарантированное) свойство, т.к. роли оно всё равно не играет
Код:
; Local $oElement = _UIA_GetControlTypeElement($oParent, $UIA_EditControlTypeId, "OmniboxViewViews", "HelpText")
Local $oElement = _UIA_GetControlTypeElement($oParent, $UIA_EditControlTypeId, True, "IsEnabled")



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

Пока сочинял ответ, вы уже добавили, что всё получилось. Ну и хорошо. Мои поздравления :beer:
 
Верх