Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 1
1

WebBrowser и его злейший враг JavaScript

24.03.2016, 08:27. Показов 1810. Ответов 0

Author24 — интернет-сервис помощи студентам
Суть проблемы, которой я до последнего делиться ни с кем не хотел, в следующем.
Есть очень сложная задача - создать мини приложение, тыкающее галочку и кнопку принять на веб морде сетевого девайса. Почему именно так не спрашивайте, ответ вам как наверное и мне не понравится...
Если кому интересно девайс UniPing, а кнопочка - "Отключить все уведомления" (вернее чекбокс).
Вот он:
HTML5
1
<input type="checkbox" name="nf_disable">
И кнопочка принять:
HTML5
1
<input type="submit" value="Применить изменения">

Итак, соорудил я по примерам, которыми щедро балуют поисковики приложеньице:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
        }
        string Check = "";
        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.Navigate("http://admin:12345@10.0.1.128/settings.html");
            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                Application.DoEvents();
 
 
            foreach (HtmlElement he in webBrowser1.Document.GetElementsByTagName("INPUT"))
            {
                if (he.GetAttribute("name") == "nf_disable")
                {
                    he.InvokeMember("CLICK");
                    break;
                }
            }
            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                Application.DoEvents();
            Thread.Sleep(2000);
 
            foreach (HtmlElement he in webBrowser1.Document.GetElementsByTagName("INPUT"))
            {
                if (he.GetAttribute("type") == "submit")
                {
                    he.InvokeMember("CLICK");
                    break;
                }
            }
            this.Close();
        }
Далее опытным путем проверил, что клики проходят (отдельно создавал приложение в котором это всё визуально отображалось).
Но увы, при попытке принять изменения кликом на кнопке "Submit" вылетает ошибка JavaScript-а:

"Uint8Array" не определено
Код: 0

Естественно после закрытия любой кнопкой этого окна уже ничего не происходит (пробовал давить всплывающие ошибки, результат тот же: положение галочки в чек боксе неизменно)
При этом каждый из браузеров IE, Chrome и FF спокойно выполняют этот скрипт.

От безысходности и растерянности попробовал поставить сторонний компонент Awesomium, но как выяснилось он не заточен под парсинг HTML, и как следствие отловить элемент и кликнуть на него не так то просто, да и мануалов не нашел.

Уважаемые знатоки, как поставить "Галочку в квадратик"?

Добавлено через 22 часа 23 минуты
Попробовал сегодня создать на базе Awesomium, по примерам приведенным в темах неподалёку.
Получилось примерно следующее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Awesomium.Core;
using Awesomium.Windows.Forms;
 
namespace AweClicker
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private async void button1_Click(object sender, EventArgs e)
        {
            webControl1.Source = "http://admin:YtCjhbnm@10.0.1.135/settings.html".ToUri();
            await webControl1.WaitForLoadingComplete();
            using (dynamic document = (JSObject)webControl1.ExecuteJavascriptWithResult("document"))
            {
                var buttons = document.getElementsByTagName("INPUT");
                for (int i = 0; i < buttons.length; i++)
                {
                    if (buttons[i].name == "nf_disable")
                    {
                        buttons[i].click(); break;
                    }
                }                
                document.Submit();
            }
        }
 
    }
    static class WVExtesions
    {
        public static Task WaitForLoadingComplete(this IWebView wv)
        {
            var tcs = new TaskCompletionSource<bool>();
            FrameEventHandler handler = ((sender, e) =>
            {
                if (!(sender as IWebView).IsLoading)
                {
                    tcs.TrySetResult(true);
                }
            }
            );
            wv.LoadingFrameComplete += handler;
            tcs.Task.ContinueWith(_ =>
            {
                wv.LoadingFrameComplete -= handler;
            }, TaskContinuationOptions.ExecuteSynchronously);
            return tcs.Task;
        }
    }
}
Но как выяснилось, даже вручную открытая страница через WebControl Awesomium-а не реагирует на нажатие кнопки submit.

Итого, яваскрипт на этой странице полностью игнорируется, в то время как в веббраузере он хотя бы вызывал ошибку...

Возникает вопрос, а можно ли в принципе подключиться к IE через API?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.03.2016, 08:27
Ответы с готовыми решениями:

Спирт ваш враг! Гоните его!
Мне больше спиртом нравится смывать. Заливаю в ванночку спирт, окунаю плату и тру зубной щеткой....

Дописать код игры так, что, когда приближается враг, расстрелять его
#include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; /** * CodinGame planet is being...

Javascript в webbrowser
Использую на форме webBrowser1. Просто хочу чтобы отображался нужный сайт public Form1() {...

javascript и webbrowser
Доброго времени суток, возник следующий вопрос: Есть такой код страницы, мне нужно выполнить...

0
24.03.2016, 08:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2016, 08:27
Помогаю со студенческими работами здесь

WebBrowser Javascript
Здравствуйте! Передо мной встала задача выполнить javascript функцию (click), которая генерирует...

WebBrowser и javascript
Доброго времени суток Начал разбираться с webBrowser встретился с проблемой: при переходе на сайт...

Delphi. WebBrowser + Javascript
Доброго времени суток! Мне нужен код который будет нажимать на кнопку запрограммированной на...

WebBrowser не воспроизводит JavaScript
Не работает скрипт, через обычный браузер открывает, через C# - тупо белая страница. Тест:...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru