Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
11 / 11 / 0
Регистрация: 23.11.2014
Сообщений: 114
1
.NET 4.x

Управление элементами webBrowser кодом

13.03.2017, 14:49. Показов 1162. Ответов 13
Метки нет (Все метки)

Всем доброго дня!
Я понимаю, что данная тема заезжена и что я не первый такой умник, но поверьте мне это последнее что я пробую в решении моей проблемы, я перечитал уже все и перепробовал тоже, так что не сердитесь.

Дело в том, что мне необходимо управлять веб элементом, который не имеет ID, так они выглядят

HTML5
1
<input type="text" name="@user.userid" value="" size="40">
HTML5
1
<input type="password" name="@user.password" value="" size="40" autocomplete="OFF">
HTML5
1
<input type="submit" value="Логин" name="Submit" class="entry_button" onmouseover="this.className='entry_buttonhover'" onmouseout="this.className='entry_button'">
я перепробовал все что смог найти на просторах сети, но добраться до этих элементов так и не удалось.

Быть может решение перед носом, но как то ни как((

Прошу помочь, заранее благодарю.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2017, 14:49
Ответы с готовыми решениями:

Создание и управление динамическими элементами
Всем большое Здрасти!! На форме нужно динамически добавлять картинки и кликать на них. Нашел...

Управление элементами CheckedListBox и сохранение их состава и состояния
Есть CheckedListBox со списком, необходимо удалять из списка значения и добавлять новые, как это...

Управление кодом через inputfield
Все наверное знают, что есть UnityEvent. Так вот, в редакторе он видит публичные методы скрипта....

Управление компонентом WebBrowser
Здраствуйте, многоуважаемые. Я начинающий программист, до C# писал разве что на Turbo C/Paskal лет...

13
5943 / 2274 / 668
Регистрация: 11.04.2015
Сообщений: 3,762
Записей в блоге: 43
13.03.2017, 15:03 2
Bitton, наиболее очевидное в данном случае решение - использовать метод GetElementsByTagName. Вытаскиваешь с его помощью элементы input из документа, дальше обходишь в цикле, проверяешь значения атрибутов, по которым можно однозначно идентифицировать элемент и все.
0
11 / 11 / 0
Регистрация: 23.11.2014
Сообщений: 114
13.03.2017, 16:08  [ТС] 3
попробовал вот так

VB.NET
1
2
3
4
Dim MyObject As HtmlElement
            For Each MyObject In WebB.Document.GetElementsByTagName("input")
                MsgBox(CStr(MyObject.Name))
            Next
но как бы ни чего не находит вообще
0
Администратор
Эксперт .NET
13989 / 11350 / 4595
Регистрация: 17.03.2014
Сообщений: 22,941
Записей в блоге: 1
13.03.2017, 16:28 4
Bitton, id нет, но зато есть name. По нему тоже можно искать
VB.NET
1
Dim el As HtmlElement = WebB.Document.All.GetElementsByName("@user.userid").OfType(Of HtmlElement)().SingleOrDefault()
0
5943 / 2274 / 668
Регистрация: 11.04.2015
Сообщений: 3,762
Записей в блоге: 43
13.03.2017, 16:32 5
Цитата Сообщение от Bitton Посмотреть сообщение
но как бы ни чего не находит вообще
Не имея примера, я ничего сказать не могу. В аттаче пример, где все работает.
Вложения
Тип файла: zip FIndInputs.zip (62.5 Кб, 2 просмотров)
0
11 / 11 / 0
Регистрация: 23.11.2014
Сообщений: 114
13.03.2017, 16:47  [ТС] 6
ни чего не выдает, быть может потому что страница не успевает прогружаться, понаставил везде
VB.NET
1
2
3
Do Until WebB.ReadyState = WebBrowserReadyState.Complete
                Application.DoEvents()
            Loop
исчерпал уже себя(
Миниатюры
Управление элементами webBrowser кодом  
0
5943 / 2274 / 668
Регистрация: 11.04.2015
Сообщений: 3,762
Записей в блоге: 43
13.03.2017, 16:52 7
Bitton, ну у меня же работает? Ну, а раз так, значит проблема не в том, что это неправильный метод поиска, а в том, что я чего-то не знаю или о странице или о твоем коде. Например форма форма с этими элементами может находиться во фрейме, тогда естественно ничего не будет найдено, поскольку поиск ведется в одном документе, а элементы находятся совсем в другом. Да мало ли что там еще может быть.
0
Администратор
Эксперт .NET
13989 / 11350 / 4595
Регистрация: 17.03.2014
Сообщений: 22,941
Записей в блоге: 1
13.03.2017, 16:52 8
Bitton, тебе не кажется что нужно сначала дождаться окончания загрузки, а потом искать элемент? Плюс лучше подписаться на событие DocumentCompleted чем делать цикл с ожиданием.
0
11 / 11 / 0
Регистрация: 23.11.2014
Сообщений: 114
13.03.2017, 17:03  [ТС] 9
дело в том, что когда я использую selenium через vba, то он у меня селектит еще фрейм, но если выбираешь
VB.NET
1
document.all
разве данный прием не игнорит фреймы? вот страница, которую необходимо обработать
https://esales.rsg.org.ru/esales/esa-bc/
0
Администратор
Эксперт .NET
13989 / 11350 / 4595
Регистрация: 17.03.2014
Сообщений: 22,941
Записей в блоге: 1
13.03.2017, 17:10 10
Bitton, насколько я помню коллекция All работает в контексте одного документа. Поэтому нужно сначала найти фрейм, взять его свойство Document и обращаться к его коллекции All
0
11 / 11 / 0
Регистрация: 23.11.2014
Сообщений: 114
13.03.2017, 17:55  [ТС] 11
OwenGlendower, DocumentCompleted врятли подойдет, так как у меня обработка двойного нажатия на DBGridView, так как я от туда беру логин и пароль.

Добавлено через 43 минуты
Посмотрел по свойствам webB, нужный мне фрейм находится в activeelement вот что попробовал

VB.NET
1
2
3
4
5
6
7
8
9
For Each element As HtmlElement In WebBrowser1.Document.ActiveElement.Document.GetElementsByTagName("input")
            If element.Name = "@user.userid" Then
                MsgBox(element.OuterHtml)
            ElseIf element.Name = "@user.password" Then
                MsgBox(element.OuterHtml)
            ElseIf element.GetAttribute("type") = "submit" Then
                MsgBox(element.OuterHtml)
            End If
        Next
Но по прежнему ни какого отклика, может фрейм по другому ищется, помогите начинающему пожалуйста.
0
1414 / 1318 / 302
Регистрация: 03.10.2012
Сообщений: 1,379
13.03.2017, 18:46 12
Лучший ответ Сообщение было отмечено OwenGlendower как решение

Решение

Цитата Сообщение от Bitton Посмотреть сообщение
может фрейм по другому ищется,
А че его искать, там же на главной странице есть его адрес
HTML5
1
<frame name="main" src="LoginBox.jsp?returnpage=Welcome.jsp">
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        WebBrowser1.Navigate("https://esales.rsg.org.ru/esales/esa-bc/LoginBox.jsp?returnpage=Welcome.jsp")
    End Sub
 
    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        For Each element As HtmlElement In WebBrowser1.Document.ActiveElement.Document.GetElementsByTagName("input")
            If element.Name = "@user.userid" Then
                MsgBox(element.OuterHtml)
            ElseIf element.Name = "@user.password" Then
                MsgBox(element.OuterHtml)
            ElseIf element.GetAttribute("type") = "submit" Then
                MsgBox(element.OuterHtml)
            End If
        Next
    End Sub
0
5943 / 2274 / 668
Регистрация: 11.04.2015
Сообщений: 3,762
Записей в блоге: 43
13.03.2017, 19:05 13
Лучший ответ Сообщение было отмечено OwenGlendower как решение

Решение

Цитата Сообщение от Bitton Посмотреть сообщение
разве данный прием не игнорит фреймы?
С чего бы это? Это коллекция элементов документа, а в каждом фрейме свой документ
Цитата Сообщение от Bitton Посмотреть сообщение
вот страница, которую необходимо обработать
Нужный фрейм называется main, стало быть как-то так должно сработать
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
        For Each frame As HtmlWindow In WebBrowser1.Document.Window.Frames
            If frame.Name = "main" Then
                For Each element As HtmlElement In frame.Document.GetElementsByTagName("input")
                    If element.Name = "@user.userid" Then
                        MsgBox(element.OuterHtml)
                    ElseIf element.Name = "@user.password" Then
                        MsgBox(element.OuterHtml)
                    ElseIf element.GetAttribute("type") = "submit" Then
                        MsgBox(element.OuterHtml)
                    End If
                Next
            End If
        Next
1
11 / 11 / 0
Регистрация: 23.11.2014
Сообщений: 114
13.03.2017, 20:50  [ТС] 14
diadiavova, не пробовал, но пример MrCrown, мне зашел☺свою задачу я решил, всем большое спасибо))OwenGlendower, спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2017, 20:50

Управление комбобоксами из webbrowser
как кликнуть по кнопке которая в комбобоксе? &lt;select name=&quot;action&quot;&gt; &lt;option...

Управление cookie созданных в webbrowser
Я через встроенный веб браузер делаю авторизацию в вк,далее после перезахода в программу,при...

C++ | Взаимодействие с элементами страницы в WebBrowser
Добрый вечер. Не смог найти необходимую мне информацию, поэтому обращаюсь к Вам. Во-первых меня...

Управление диалоговым окном, открытым через WebBrowser
На сайте есть кнопка &quot;Загрузить&quot;, которая вызывает диалоговое окно выбора файла. Вопрос, как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru