Страницы: 1
RSS
Валидация полей ангулярной формы без SendKeys, ошибка Syntax error, unrecognized expression
 
Здравствуйте!

Скачать честно - не уверен, что данный вопрос относится к VBA или JS.
Практически дописал макрос, но тут возникла ошибка.
В работе макроса использую вставки кода JS для заполнения полей формы в браузере.
Казалось, нашел код, который подходит, но он начал выдавать ошибку: Syntax error, unrecognized expression: [data-ng-model=text]
Сам код выглядит так:
Код
1
2
oie.document.parentWindow.execScript "angular.element('[data-ng-model=some.text ]').scope().some.text = '12345';"
oie.document.parentWindow.execScript "angular.element('[data-ng-model=some.text ]').scope().$apply();"

Ошибку вижу в инструменте разработчика, который открывается по нажатию F12 в IE.
Исходя из текста ошибки, получается, что выражение не распознано. Но для меня такая ошибки в настоящее время - это очень сложно, пока только учусь.
Возможно, кто-нибудь сталкивался с такой ошибкой.
Помогите, пожалуйста, понять в чем причина ошибки и как ее исправить.
Спасибо!


UPD:
Попробовав различные варианты кода, чтобы понять откуда берется ошибка, пришел к выводу, что ошибка появляется, если название свойства data-ng-model имеет в себе точку.
К примеру, ошибка не возникает в случае, если:
Код
1
data-ng-model = sometext
и ошибка возникает, если:
Код
1
data-ng-model = some.text
Изменено: footballplayer - 10.12.2017 12:43:09
 
кавычки для того и придуманы, чтобы таких ошибок не возникало
а вы опять фигачите текст в скрипт без кавычек...
 
Игорь, спасибо за ответ!

Подскажите, пожалуйста, в каком месте в тексте у меня ошибка с кавычками?

В другой теме Вы подсказали, что нужно взять переменную ("ivar") в кавычки, я так сделал и все отлично заработало. Вот пример:
Код
1
ie.document.parentWindow.execScript "angular.element(document.getElementsByTagName('input')[1]).scope().text ='" & ivar & "';"

В данном же случае я беру в кавычки название свойства data-ng-model:
Код
1
2
ie.document.parentWindow.execScript "angular.element('[data-ng-model="some.text" ]').scope().some.text = '" & ivar & "';"
oie.document.parentWindow.execScript "angular.element('[data-ng-model=some.text ]').scope().$apply();"

При чем, если название свойства data-ng-model состоит из одного слова целиком без точек посреди, то ошибка не возникает и все работает отлично.
Вероятно, я делаю что-то не так...
Изменено: footballplayer - 10.12.2017 12:43:36
 
footballplayer, исправьте везде: кавычки.
 
попробуйте так:
Код
1
ie.document.parentWindow.execScript "angular.element('[data-ng-model=""some.text""]').scope().some.text = '" & ivar & "';"
 
Игорь, спасибо а ответ! Сделал как вы написали - сразу заработало. Спасибо огромное!
Если можно, небольшой вопрос. При исполнении скрипта заполняются все теги input, у который type = text, но не заполняются те, у которых type = data.
Возможно, к ним нужно применять другой способ?

Задача следующая: есть форма на сайте, которую необходимо заполнять часто. Знания под написание макроса на обычную форму на сайте у меня немного есть, и, более-менее все понятно. Но в данном случае оказалось, что форма написана с применением (как позже выяснилось) ангулярного языка (angular js) (если правильно выразился).
Данная форма заполняется корректно, но все проблема в том, что после заполнение формы через макрос VBA, получается, что данные в поля вставились, а проверка полей не прошла и приходится в каждое поле вводить хотя бы один символ с клавиатуры физически или применять application.sendKeys в макросе к каждому заполняемому полю, который приводит к постоянным ошибкам.
В связи с этим искал способ обхода проверки полей ангуляром, наткнулся на тему, где описывалось, что применением кода:
Код
1
oie.document.parentWindow.execScript "angular.element('[data-ng-model=""some.text""]').scope().some.text = '12345';"
Код
1
oie.document.parentWindow.execScript "angular.element('[data-ng-model=""some.text""]').scope().$apply();" '''
можно занести данные в форму и провести валидацию поля одновременно.

Сказать честно, пока не знаю на сколько этот способ работает, т.к. пока не удалось применить ко всем полям формы макросом VBA.
Возможно, кто-нибудь сталкивался с такой задачей и поможет в ее реализации...
Изменено: footballplayer - 10.12.2017 19:47:01
 
можно без всех этих скриптов обойтись
заполняете поля формы обычным способом
а потом для каждого заполненного поля генерируете событие change (автоматически отработает скрипт, назначенный на событие onchange)

http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=96514&TITLE_SEO=96514-rabota-s-ie-iz-vba&MID=798258#message798258
 
Игорь, о таком методе не знал.
Попытался повторить на своем примере, но, почему-то, не получилось)
В моем коде на сайте у элементов нет свойства ID, поэтому приходится цепляться за свойство data-ng-model, примерно таким образом:
Код
1
2
3
4
5
6
7
For Each Text In oie.document.getElementsByTagName("input")
If Text.getAttribute("data-ng-model") = "sometext" Then
Text.Value = "12345"
IE_RaiseEvents (Text), "change,keydown"
Exit For
End If
Next Text
Попытался сделать так, но выдает ошибку.
Если Вам несложно, могли бы вы на примере моего кода подсказать как можно сгенерировать событие change, думаю, смог бы применить это на оставшийся код.

UPD.
Предварительно, конечно, добавил в тот же модуль, где написан скрипт, данную функцию, которая указана по Вашей ссылке выше
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub IE_RaiseEvents(ByRef EL As Object, ByVal events$)
    On Error Resume Next
    ' здесь myInternetExplorer - ссылка на запущенный браузер
    Dim eventObj As Object, event_name
    events$ = Replace(events$, ";", ",")
  
    For Each event_name In Split(events$, ",")
        EL.raiseEvent "on" & event_name        ' for IE8
  
        Set eventObj = myInternetExplorer.document.createEvent("HTMLEvents")
        eventObj.initEvent event_name, True, False        ' for IE9 or newer
        EL.dispatchEvent eventObj
    Next
    Set eventObj = Nothing
End Sub
Изменено: footballplayer - 10.12.2017 22:42:47
 
скобки зачем вокруг (Text) поставили?

Цитата
могли бы вы на примере моего кода подсказать как можно сгенерировать событие change
вы почти все правильно сделали
осталось в моей функции заменить myInternetExplorer на oie
(если переменная oie - глобальная)
Удачи!
 
Игорь, спасибо за помощь!
Попробовал, но в данном случае не сработало) Текст в поле вставляется, но поле все равно светится как будто не прошло валидацию.
Буду смотреть еще варианты. Спасибо!
Страницы: 1
Читают тему
Наверх
Loading...