Vb net webbrowser ошибка сценария

649 / 601 / 92

Регистрация: 19.03.2012

Сообщений: 1,128

1

.NET 4.x

15.10.2013, 08:26. Показов 3557. Ответов 4


Студворк — интернет-сервис помощи студентам

Приветствую, уважаемые форумчане!
С помощью компонента WebBrowser получаю заголовок страницы, URL которой указывает пользователь. При этом на некоторых сайтах, к примеру MSN, вылезает «ошибка сценария» (скриншот прилагаю). Эту ерунду можно как-то обработать, чтобы не появлялась?

Миниатюры

Обработка ошибок сценария в компоненте WebBrowser
 



0



Nachrichter

649 / 601 / 92

Регистрация: 19.03.2012

Сообщений: 1,128

15.10.2013, 08:55

 [ТС]

2

Лучший ответ Сообщение было отмечено как решение

Решение

Решение найдено. В событие DocumentCompleted:

VB.NET
1
AddHandler CType(sender, WebBrowser).Document.Window.Error, AddressOf BrowserWindow_Error

Ну и сама обработка:

VB.NET
1
2
3
Private Sub BrowserWindow_Error(ByVal sender As Object, ByVal e As HtmlElementErrorEventArgs)
   e.Handled = True
End Sub



3



Egor2014

29 / 8 / 3

Регистрация: 22.10.2013

Сообщений: 447

20.12.2013, 10:11

3

У меня другая ошибка вылазит смотреть Миниатюру
А строку 136, нашел в файле Form1.Designer.vb

HTML5
1
Me.ClientSize = New System.Drawing.Size(905, 364)

Windows XP. Как поправить ошибку?

Миниатюры

Обработка ошибок сценария в компоненте WebBrowser
 



0



407 / 359 / 82

Регистрация: 07.10.2009

Сообщений: 558

20.12.2013, 12:47

4

Цитата
Сообщение от Egor2014
Посмотреть сообщение

У меня другая ошибка вылазит

Ошибка действительно другая и к этой теме отношения не имеет.
Указанная Вами строка такую ошибку выдать не может, смотрите строку 136 в других файлах проекта.
Хотя странно, при падении IDE сама открывает проблемный файл и выделяет строку.
По-моему, так!



0



Antontth

1 / 1 / 0

Регистрация: 05.07.2015

Сообщений: 42

20.09.2015, 16:48

5

VB.NET
1
WebBrowser1.ScriptErrorsSuppressed = True '

отключает предупреждение об ошибке в WEBBROWSER-e



0



You should make the WebBrowser Control COM Visible and give it the proper permissions:

#region Using Statements:



using System;
using System.Windows.Forms;
using System.Security.Permissions;



#endregion



[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public partial class Form1 : Form
{



public Form1()
{

InitializeComponent();

// WebBrowser Configuration:
webBrowser1.ObjectForScripting = this;
webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.IsWebBrowserContextMenuEnabled = false;

}




private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.Navigate("https://www.google.com/");
}


}

or:

#region Using Statements:



using System;
using System.Windows.Forms;
using System.Security.Permissions;



#endregion



[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public partial class Form1 : Form
{



public Form1()
{

InitializeComponent();

// WebBrowser Configuration:
webBrowser1.ObjectForScripting = new ObjectForScripting();
webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.IsWebBrowserContextMenuEnabled = false;

}




private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.Navigate("https://www.google.com/");
}


[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class ObjectForScripting
{

// User Code to handle events..

}


}

Note: This may not run correctly in debug mode.

Also, if you need the Registry Key set for local App Compatibility, it also wont run in debug mode.

IsWOW64 = @"HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftInternet ExplorerMAINFeatureControlFEATURE_BROWSER_EMULATION";



IsNotWOW64 = @"HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerMAINFeatureControlFEATURE_BROWSER_EMULATION";

RRS feed

  • Remove From My Forums
  • Вопрос

  • some webpages have errors in scripts, my webbrowser control fire a windows with a Script Error Dialog for say or no

    if i set

     WebBrowser.ScriptErrorsSuppressed = True;

    in TRUE this will show the Visual Studio Debuger Very Times!!!!!

    in FALSE will show Script Error Dialog

    what i must do?

Все ответы

  • Hi knive1,

    Did you mean you want to show the Visual Studio Debugger when setting WebBrowser.ScriptErrorSuppressed to true? If so, the following code may help you.

    Code Snippet

    namespace WebBrowser

    {

        public partial class Form6 : Form

        {

            public Form6()

            {

                InitializeComponent();

            }

            private void Form6_Load(object sender, EventArgs e)

            {

                this.webBrowser1.ScriptErrorsSuppressed = true;

                this.webBrowser1.Navigate(@»C:a.htm»);

                this.webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

            }

            void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)

            {

                if (this.webBrowser1.ScriptErrorsSuppressed)

                    this.webBrowser1.Document.Window.Error += new HtmlElementErrorEventHandler(Window_Error);

            }

            void Window_Error(object sender, HtmlElementErrorEventArgs e)

            {

                // your customized code here

                e.Handled = true;

            }

        }

    }

    Hope this helps.

    Best regards.

  • yeah this is what i already have!

    i set ScriptErrors to true when a new Tab has open!

    after in document complete i have for fire Windows_Error event

    and i have e.Handled = true;

    see the results when a script error happen

    http://www.screencast.com/t/dAamVQwdiK

    and i want remove script errors boxs

    like Debbuger and Windows Error Box

    now can i remove it from show?

    thanks

  • This is *not* a script error prompt.  It is your app that is crashing on a NullReferenceException.  Debug your code.

  • what must i do?

    this only happen when i set ScritpSupressErrors to TRUE

    and after i say No Very times browser continues working well this only happen when cath a script error!

    what i need to do?

    thanks

  • What does the error message translate to in English?  Control Panel + Internet Options, Advanced tab, Browsing, what are the Disable script debugging options set to?

  • not in internet explorer!

    is im my own Browser Control

    i think my image is in english

    see last example in Up Post

    Pass WebBrowser.ScriptsSupressErrors = true; = Remove Script Windows Error Box, but will show the visual studio debugger

    WebBrowser.ScriptsSupressErrors = false; = Will Show  Script Windows Error Box only

    i want to remove all this error boxs!!

  • Sigh, you are making this a lot harder than it needs to be.  WebBrowser uses Internet Explorer.  The actual error message in your screenshot looks like Portuguese.  If it’s not too much trouble, answer my questions.  Otherwise, good luck with it.

  • the only thing is in portuguese is: «null» é nulo ou não é um objecto

    In English mean: «null» its null or not is an object

    my program: www.callysto.net

    in v1.1 Public version SupressErrors is = false;

    im updating webbrowser and i need remove errors from scripts so now im try using SupressErrors = true;

    if i preset NO very times broser continue navigaiting

    if i click YES VS will debug page error:

    function openpopup(popurl){

    var winpops=window.open(popurl,»»,»width=820px,height=700px,scrollbars»)

    -> winpops.blur()

    window.focus()

    }

    -> = VS Debug error Line!

    site used for test script errors: http://www.gsmpt.net/

    ——

    any way to stop IE touch in my browser?

  • I’m having the same problem…. When the scripting is supressed… the dialog for debugging pops up instead… it results from poor  scripting on the web side… but i cant control everyone else’s sloppiness… IE 7 handles it ok, so i know there must be a way to eliminate the debugging box from popping up. I think that is what is desired here.

644 / 597 / 91

Регистрация: 19.03.2012

Сообщений: 1,127

1

.NET 4.x

15.10.2013, 08:26. Показов 3342. Ответов 4


Приветствую, уважаемые форумчане!
С помощью компонента WebBrowser получаю заголовок страницы, URL которой указывает пользователь. При этом на некоторых сайтах, к примеру MSN, вылезает «ошибка сценария» (скриншот прилагаю). Эту ерунду можно как-то обработать, чтобы не появлялась?

Миниатюры

Обработка ошибок сценария в компоненте WebBrowser
 

0

Nachrichter

644 / 597 / 91

Регистрация: 19.03.2012

Сообщений: 1,127

15.10.2013, 08:55

 [ТС]

2

Лучший ответ Сообщение было отмечено как решение

Решение

Решение найдено. В событие DocumentCompleted:

VB.NET
1
AddHandler CType(sender, WebBrowser).Document.Window.Error, AddressOf BrowserWindow_Error

Ну и сама обработка:

VB.NET
1
2
3
Private Sub BrowserWindow_Error(ByVal sender As Object, ByVal e As HtmlElementErrorEventArgs)
   e.Handled = True
End Sub

3

Egor2014

29 / 8 / 3

Регистрация: 22.10.2013

Сообщений: 447

20.12.2013, 10:11

3

У меня другая ошибка вылазит смотреть Миниатюру
А строку 136, нашел в файле Form1.Designer.vb

HTML5
1
Me.ClientSize = New System.Drawing.Size(905, 364)

Windows XP. Как поправить ошибку?

Миниатюры

Обработка ошибок сценария в компоненте WebBrowser
 

0

407 / 359 / 82

Регистрация: 07.10.2009

Сообщений: 558

20.12.2013, 12:47

4

Цитата
Сообщение от Egor2014
Посмотреть сообщение

У меня другая ошибка вылазит

Ошибка действительно другая и к этой теме отношения не имеет.
Указанная Вами строка такую ошибку выдать не может, смотрите строку 136 в других файлах проекта.
Хотя странно, при падении IDE сама открывает проблемный файл и выделяет строку.
По-моему, так!

0

Antontth

1 / 1 / 0

Регистрация: 05.07.2015

Сообщений: 42

20.09.2015, 16:48

5

VB.NET
1
WebBrowser1.ScriptErrorsSuppressed = True '

отключает предупреждение об ошибке в WEBBROWSER-e

0

You should make the WebBrowser Control COM Visible and give it the proper permissions:

#region Using Statements:



using System;
using System.Windows.Forms;
using System.Security.Permissions;



#endregion



[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public partial class Form1 : Form
{



public Form1()
{

InitializeComponent();

// WebBrowser Configuration:
webBrowser1.ObjectForScripting = this;
webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.IsWebBrowserContextMenuEnabled = false;

}




private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.Navigate("https://www.google.com/");
}


}

or:

#region Using Statements:



using System;
using System.Windows.Forms;
using System.Security.Permissions;



#endregion



[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public partial class Form1 : Form
{



public Form1()
{

InitializeComponent();

// WebBrowser Configuration:
webBrowser1.ObjectForScripting = new ObjectForScripting();
webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.IsWebBrowserContextMenuEnabled = false;

}




private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.Navigate("https://www.google.com/");
}


[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class ObjectForScripting
{

// User Code to handle events..

}


}

Note: This may not run correctly in debug mode.

Also, if you need the Registry Key set for local App Compatibility, it also wont run in debug mode.

IsWOW64 = @"HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftInternet ExplorerMAINFeatureControlFEATURE_BROWSER_EMULATION";



IsNotWOW64 = @"HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerMAINFeatureControlFEATURE_BROWSER_EMULATION";

Все привет! Если вы, как и я приверженцы стандартных контролов framework. И при загрузке сайта возникаю ошибки сценария «На этой странице произошла ошибка сценария. Объект не поддерживает свойство или метод. Вы хотите продолжить выполнения сценария на этой странице?»:

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

Можно попробовать воспользоваться свойством:

webBrowser1.ScriptErrorsSuppressed = true;

После установки свойства значения true окон об ошибках больше мы не увидим, но это не означает что они пропали. Сайт по-прежнему будет выглядеть криво, а часть скриптов на Java Script просто не работает.

Мы даже можем увидеть следующую информацию, к примеру при заходе на сайт вкнонтакте.

Проблема кроется в том, что все современные сайт отказались от поддержки Internet Explorer.

А вот теперь зная проблему, мы можем ее решить, есть два варианта, если мы имеем доступ к сайту к изменению его html разметки, то нам достаточно добавить следующие строчки кода:

<head><meta httpequiv=«X-UA-Compatible» content=«IE=Edge» /></head>

Данный мета тег говорит о том, как загружать страницу, а точнее какой браузер использовать по умолчанию для контента, и как мы видим это Edge. Хочу заранее сказать, что такие теги по умолчанию вставлены во все поисковые системы, или аналоги их, потому при загрузке не возникает не каких JS ошибок.

Но что делать если мы хотим использовать сайт, к которому не имеем доступа для изменений html разметки? 

Ничего сложного, просто надо внести изменения в реестре, я даже не знаю почему этого не сделали по умолчанию в windows 10 для всех приложений, видимо это не возможно, поэтому вначале сделаем вручную, а потом покажу как это сделать программно.

Пример покажу под Windows 10 64  так как не могу протестировать для 32 бит версии или других OS. Но по сути ничего не меняется за исключением ветки для 32 и 64 версии.

//КомпьютерHKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerMainFeatureControlFEATURE_BROWSER_EMULATION

//КомпьютерHKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftInternet ExplorerMainFeatureControlFEATURE_BROWSER_EMULATION

//КомпьютерHKEY_CURRENT_USERSOFTWAREMicrosoftInternet ExplorerMainFeatureControlFEATURE_BROWSER_EMULATION

Вам нужно будет указать имя своего приложения, создать параметр Dword и десятичное значения устанавливаем в 11001.

Вроде как проблема и решена от части, так как webBrowser по умолчанию использует Internet Explorer, и изменить мы это не можем, но что нам говорит MS, а говорит нам о том, что мы можем эмулировать работу Edge, то есть мы будем с функциями Edge использовать Internet Explorer. Нам будут доступны для полноценной работы все теги html и JS. Но, к сожалению, мы так же не сможем зайти на многие сайты, так как они принудительно отключили поддержку Internet Explorer, и сделать уже с этим нечего, возможно MS когда ни будь добавят Edge в webBrowser, хотя уже прошло 10 лет, но ничего не изменилось. И для решения приходится использовать сторонние браузеры.

Как и обещал привожу пример автоматического добавления в реестр значений, в соответствии с вашей системой.

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

  private void Form1_Load(object sender, EventArgs e)

        {

            var appName = Process.GetCurrentProcess().ProcessName + «.exe»;

            SetIE8KeyforWebBrowserControl(appName);

            webBrowser1.ScriptErrorsSuppressed = true;

            webBrowser1.Url = new Uri(«https://www.nookery.ru»);

        }

        private void SetIE8KeyforWebBrowserControl(string appName)

        {

            RegistryKey Regkey = null;

            try

            {

                // Для 64-разрядной машины

                if (Environment.Is64BitOperatingSystem)

                    Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@»SOFTWAREWow6432NodeMicrosoftInternet ExplorerMainFeatureControlFEATURE_BROWSER_EMULATION», true);

                else  //Для 32-разрядной машины

                    Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@»SOFTWAREMicrosoftInternet ExplorerMainFeatureControlFEATURE_BROWSER_EMULATION», true);

                //Если путь неправильный или

                //Если у пользователя нет привилегий доступа к реестру

                if (Regkey == null)

                {

                    MessageBox.Show(«Сбой настроек приложения — адрес не найден»);

                    return;

                }

                string FindAppkey = Convert.ToString(Regkey.GetValue(appName));

                // Проверьте, присутствует ли ключ

                if (FindAppkey == «11001»)

                {

                    MessageBox.Show(«Необходимые параметры приложения присутствуют»);

                    Regkey.Close();

                    return;

                }

                // Если ключ отсутствует, добавьте ключ, значение ключа 11001 (десятичное)

                if (string.IsNullOrEmpty(FindAppkey))

                    Regkey.SetValue(appName, unchecked((int)0x1F40), RegistryValueKind.DWord);

                // Проверка наличия ключа после добавления

                FindAppkey = Convert.ToString(Regkey.GetValue(appName));

                if (FindAppkey == «11001»)

                    MessageBox.Show(«Параметры приложения успешно применены»);

                else

                    MessageBox.Show(«Сбой настроек приложения, ссылка: « + FindAppkey);

            }

            catch (Exception ex)

            {

                MessageBox.Show(«Сбой настроек приложения»);

                MessageBox.Show(ex.Message);

            }

            finally

            {

                // Закрываем реестр

                if (Regkey != null)

                    Regkey.Close();

            }

        }

A Client hired me about a week ago to create a webbrowser on a vb.net application with some basic functions(More like a macro which could help with his Blog activities). However I somehow discovered that there is an impossible error to fix when I’m trying to browse the Google http://Blogger.com/home dashboard page even when I’m logged in on a gmail account, there’s a really annoying error coming up (Script Error) saying this

object doesn’t support property or method ‘getcomputedstyle’

Has anyone maybe the solution to this error? It’s really important to get this fixed as soon as possible as I’m on a deadline and this whole Blogger thing could be a deal-breaker.

I should probably mention that I tried disabling Script Errors from IE Options but that didn’t help.

I also found a JS code with a possible fix to my problem but the title was probably missleading and it didn’t help me at all.

And I even gave a shot to Microsoft solution about a giving the webbrowser a TrueValue, but after taking each step and running the app I realized that neither did that work..

Lastly I added this code

WebBrowser1.ScriptErrorsSuppressed = True

and that just hides the error from appearing but the page still remains blank without my VB application crashing.

I took a screenshot of the Script Error in case it’s more helpful than me talking about it. Please offer me any possible solution you have in mind!

I’m using Visual Studio Ultimate 2013 and running my PC on Windows 8.

http://s9.postimg.org/det2x5jdr/prntscrn.png

EDIT: I still haven’t found any solution to my problem. However I tried visiting the same link on my IE to check if the browser has indeed the problem and after logging in with an account, an error pops up with this code: bX-wnrswi

Those type of errors as I read appear only on IE so I’m still not sure where exactly to look and what to do in order to avoid this freakin error. If you feel that you can help me with your advice then feel free and do it! I’m desperate..

2nd EDIT: I forgot to mention that I actually have installed Windows 8.1 instead of 8. Windows 8.1 came pre-installed with IE11 which is their brand new version and surprise-surprise is full of bugs. I’m almost certain that this version of IE is the root of my problem. However on Windows 8.1 it’s almost impossible to downgrade from IE 11 to IE 10 or just uninstall IE 11 and install an older version. However I’m searching about it, if anybody feels like he has a solution please post about it.

RESOLVED — FIXED: Finally after spending almost 6h trying to solve this worthless pie** of s*** I found a way to fix it. After trying almost everything (It’s 2AM in the morning atm) before abandoning this I thought I should give it one last try. So I just changed my project settings from run on any CPU to my PC, so x64 and I finally got passed this stupid issue.

In case anyone else has this problem, here’s the solution:

On your VB toolbar, click the drop-down arrow -> Customize -> Enable Toolbar (or Menu Bar) -> Select Build -> Add Command -> Add «Configuration Manager…(If not visible left click on your Toolbar and enable The Configuration Manager) -> Compile to whatever system you got, x32 or x64 instead of Any CPU.

A Client hired me about a week ago to create a webbrowser on a vb.net application with some basic functions(More like a macro which could help with his Blog activities). However I somehow discovered that there is an impossible error to fix when I’m trying to browse the Google http://Blogger.com/home dashboard page even when I’m logged in on a gmail account, there’s a really annoying error coming up (Script Error) saying this

object doesn’t support property or method ‘getcomputedstyle’

Has anyone maybe the solution to this error? It’s really important to get this fixed as soon as possible as I’m on a deadline and this whole Blogger thing could be a deal-breaker.

I should probably mention that I tried disabling Script Errors from IE Options but that didn’t help.

I also found a JS code with a possible fix to my problem but the title was probably missleading and it didn’t help me at all.

And I even gave a shot to Microsoft solution about a giving the webbrowser a TrueValue, but after taking each step and running the app I realized that neither did that work..

Lastly I added this code

WebBrowser1.ScriptErrorsSuppressed = True

and that just hides the error from appearing but the page still remains blank without my VB application crashing.

I took a screenshot of the Script Error in case it’s more helpful than me talking about it. Please offer me any possible solution you have in mind!

I’m using Visual Studio Ultimate 2013 and running my PC on Windows 8.

http://s9.postimg.org/det2x5jdr/prntscrn.png

EDIT: I still haven’t found any solution to my problem. However I tried visiting the same link on my IE to check if the browser has indeed the problem and after logging in with an account, an error pops up with this code: bX-wnrswi

Those type of errors as I read appear only on IE so I’m still not sure where exactly to look and what to do in order to avoid this freakin error. If you feel that you can help me with your advice then feel free and do it! I’m desperate..

2nd EDIT: I forgot to mention that I actually have installed Windows 8.1 instead of 8. Windows 8.1 came pre-installed with IE11 which is their brand new version and surprise-surprise is full of bugs. I’m almost certain that this version of IE is the root of my problem. However on Windows 8.1 it’s almost impossible to downgrade from IE 11 to IE 10 or just uninstall IE 11 and install an older version. However I’m searching about it, if anybody feels like he has a solution please post about it.

RESOLVED — FIXED: Finally after spending almost 6h trying to solve this worthless pie** of s*** I found a way to fix it. After trying almost everything (It’s 2AM in the morning atm) before abandoning this I thought I should give it one last try. So I just changed my project settings from run on any CPU to my PC, so x64 and I finally got passed this stupid issue.

In case anyone else has this problem, here’s the solution:

On your VB toolbar, click the drop-down arrow -> Customize -> Enable Toolbar (or Menu Bar) -> Select Build -> Add Command -> Add «Configuration Manager…(If not visible left click on your Toolbar and enable The Configuration Manager) -> Compile to whatever system you got, x32 or x64 instead of Any CPU.

  • Remove From My Forums
  • Вопрос

  • what is the exception code for Activex can not run
    script error

    I woudl like to trap those so I don’t too many prompts

Ответы

  • that wuold kill off all errorsso far the only way to catch ActiveX error I found  is use in the load event

    svd = directcast(Webbrowser1.ActiveXInstance, SHDocVw.WebBrowser)addHandler svd.NavigateError, AddressOf myNavigateError
    'where myNavigateError has a definition like
    
        Protected Sub myNavigateError(ByVal pDsp As Object, 
             ByRef URL As Object, ByRef Frame As Object, _
               ByRef StatusCode As Object, ByRef Cancel As Boolean)
            '.. whatever filtering or action code here...
        End Sub
    
    • Помечено в качестве ответа

      24 сентября 2009 г. 3:36

    • Изменено
      fs — ab
      18 октября 2009 г. 4:35
      visual — sample code not shown correctly in some webbrowser

Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.

DeMONiZ
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 03.01.2009 (Сб) 18:32

WebBrowser и Ошибка сценария Internet Explorer

как избавитьсся от появления этой ошибки как заблокировать ее!? давно хотел узнать ато я делаю по дурацки просто ищу если ошибка появилась то закрываю ее но этот метод меня не очень устраивает!
вот код:

Private Sub Timer1_Timer()
Dim hW&
hW& = FindWindow(vbNullString, «Ошибка сценария Internet Explorer» & Chr(0))
If hW& > 0 Then
PostMessage hW&, WM_CLOSE, 0&, 0&
End If
End Sub


Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16444
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск
  • Сайт
  • ICQ

Re: WebBrowser и Ошибка сценария Internet Explorer

Сообщение Хакер » 03.01.2009 (Сб) 19:49

Писать сценарии без ошибок.

—We separate their smiling faces from the rest of their body, Captain.

—That’s right! We decapitate them.


DeMONiZ
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 03.01.2009 (Сб) 18:32

Re: WebBrowser и Ошибка сценария Internet Explorer

Сообщение DeMONiZ » 03.01.2009 (Сб) 19:54

С этим я полностью согласен но моя программа ротатор для Серферов а уж им не приходится выбирать какие сайты смотреть! и все же мне кажется каким либо образом можно заблокировать появление этой ошибки!


Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16444
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск
  • Сайт
  • ICQ

Re: WebBrowser и Ошибка сценария Internet Explorer

Сообщение Хакер » 03.01.2009 (Сб) 19:59

Блокирование сообщения об ошибке это в принципе неправильная вещь.

—We separate their smiling faces from the rest of their body, Captain.

—That’s right! We decapitate them.


DeMONiZ
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 03.01.2009 (Сб) 18:32

Re: WebBrowser и Ошибка сценария Internet Explorer

Сообщение DeMONiZ » 03.01.2009 (Сб) 20:06

но эта ошибка не играет ни какой роли в данном случае она просто мешает. в IE каким то образом отключается показ этой ошибки.


Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16444
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск
  • Сайт
  • ICQ

Re: WebBrowser и Ошибка сценария Internet Explorer

Сообщение Хакер » 03.01.2009 (Сб) 20:10

Ну да, есть такая глобальная опция, действующая на все экземпляры IE.

—We separate their smiling faces from the rest of their body, Captain.

—That’s right! We decapitate them.


DeMONiZ
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 03.01.2009 (Сб) 18:32

Re: WebBrowser и Ошибка сценария Internet Explorer

Сообщение DeMONiZ » 03.01.2009 (Сб) 20:15

вы можете мне предложить что либо чтоб блокировать появление этой ошибки?


Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16444
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск
  • Сайт
  • ICQ

Re: WebBrowser и Ошибка сценария Internet Explorer

Сообщение Хакер » 03.01.2009 (Сб) 20:20

Нет, но я предлагаю не заниматься блокированием этой ошибки.

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

—We separate their smiling faces from the rest of their body, Captain.

—That’s right! We decapitate them.


DeMONiZ
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 03.01.2009 (Сб) 18:32

Re: WebBrowser и Ошибка сценария Internet Explorer

Сообщение DeMONiZ » 03.01.2009 (Сб) 20:26

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


tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: WebBrowser и Ошибка сценария Internet Explorer

Сообщение tyomitch » 03.01.2009 (Сб) 20:54

Дока гласит, что у веббраузера есть свойство Silent

Изображение


DeMONiZ
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 03.01.2009 (Сб) 18:32

Re: WebBrowser и Ошибка сценария Internet Explorer

Сообщение DeMONiZ » 03.01.2009 (Сб) 20:55

дайте мне ссылку на доку тогда


dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль
  • Сайт
  • ICQ

Re: WebBrowser и Ошибка сценария Internet Explorer

Сообщение dr.MIG » 05.01.2009 (Пн) 20:00

DeMONiZ писал(а):дайте мне ссылку на доку тогда

MSDN

А вообще, как уже сказал Тёмыч, установка WebBrowser1.Silent = True подавит вывод сообщения об ошибке. Только устанавливать это свойство надо не в окне свойств, а в run-time, в коде, перед загрузкой страницы.

Salus populi suprema lex


DeMONiZ
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 03.01.2009 (Сб) 18:32

Re: WebBrowser и Ошибка сценария Internet Explorer

Сообщение DeMONiZ » 06.01.2009 (Вт) 0:26

Спасибо и правда ошибка не вылезает больше!


svasti asta
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 19.01.2009 (Пн) 8:31

Re: WebBrowser и Ошибка сценария Internet Explorer

Сообщение svasti asta » 19.01.2009 (Пн) 9:00

мужики, а у меня Silent всё равно не работает
Ситуация такая — IE 7.0.5730.13, проект VBasic 6.0 SP 5, ну допустим я решил сделать оконце для пользователя с WebBrowser для просмотра внутренних (находящихся на HDD компа пользователя) гипертекстовых файлов, связанных друг с другом (href в них ссылается на другой файл на диске и т.д.) по принципу работы похожа на прогу Help, так вот окно инициализируется и стартовый файл грузится без проблем, а затем когда кликаем ссылку на другую страницу то возникает Run-Time Error ‘-2’ , но страничка всё равно грузится (под сообщением), но при нажатии оКеу — вылет из отладки, т.е. не могу проверить и отладить (в компиляции нет проблемы, только если компилировать после каждого изменения — зачем тогда отладчик нужен???)
Пробовал Silent выставля в процедуре BeforNavigate2 — один хрен
Может дело во времени срабатывания ошибки (вообще что за ошибка?), может время ей как-нить увеличить? ну там до минуты или более
:-)))))))



Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 0

Недавно я также столкнулся с проблемой, которую я хотел закрыть окно ошибки сценария JS в управлении WebBrowser в проекте, поэтому после многих тестирования я наконец использовал высокую эффективность и практическую код, чтобы идеально решить проблему ошибки сценария JS Окно в управлении веб -бруздером.

Создавая подмоторку, затем постоянно найдите окно POP -UP (оповещение, окно js -ошибки) различных типов веб -браузера в подмолке, а затем выключите окно через функцию SendMessage!

Ошибка сценария WebBrowser, Код ошибки сценария управления WebBrowser

VB.NET позволяет управлению WebBrowser показать последний метод ошибки сценария JS, который идеально решает

Следующий код может решить Windows POP -OUP различных браузеров, таких как окно ошибки сценария JS и окно оповещения в управлении WebBrowser, который может быть автоматически закрыт

Код VB.NET выглядит следующим образом:

Declare Auto Function SendMessage Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, _
                ByVal wparam As Integer, ByVal lparam As IntPtr) As IntPtr

Declare Auto Function FindWindowEx Lib "user32.dll" (ByVal parentHandle As IntPtr, ByVal childAfter As IntPtr, _
                 ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr

Public Const WM_CLOSE = &H10

Private Sub threadCheckError()
    Dim hwnd As IntPtr
    While 1
        hwnd = findwindowex (0, 0, "Internet Explorer_tridentdlgframe", "Ошибка скрипта Internet Explorer")
        If hwnd.ToInt64 > 0 Then
            SendMessage(hwnd, WM_CLOSE, 0, 0)
        End If

                 hwnd = findwindowex (0, 0, "#32770", "Сообщение с веб -страницы")
        If hwnd.ToInt64 > 0 Then
            SendMessage(hwnd, WM_CLOSE, 0, 0)
        End If

        System.Threading.Thread.Sleep(100)
        My.Application.DoEvents()
    End While
End Sub

Dim threadchk As New Threading.Thread(AddressOf threadCheckError)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    WebBrowser1.ScriptErrorsSuppressed = False
    threadchk.Start()
End sub

Перепечатано по адресу: https://www.cnblogs.com/james1207/p/3325138.html

Я не знаю, как устанавливать атрибуты, когда у меня нет ошибки, код выглядит так:

    <DIV id=serialInfoBox>
<DIV class=l>
<DIV class=progressBar>
<DIV class=o>
<DIV style="WIDTH: 0px" class=i></DIV></DIV></DIV><HGROUP>
<H2><A href="serial,stargate-universe.html">SGU Stargate Universe</A></H2></HGROUP></DIV>
<DIV class=r><IMG src="/static/serials/stargate-universe_small.jpg"> </DIV></DIV>
<DIV id=player>
<DIV id=player_2 hash="wZlV90mq4I3LgyGB6WGIgyKJvMzHhS2EvAGqhWmI25JIRMyrXIUnjAmAeIKJZqQJcIGBV1HInuKLuS2LnS1ZHWTMDqGrBk0FF9FAPSxMvuSJnAxLjZxHXy1IdSzEiSHJ1W1M" jQuery110007841996969566763="5"></DIV>
<DIV class=clearfix></DIV></DIV></DIV>
<DIV id=underPlayer><A class=l href="odcinek,stargate-universe,lost,s01e15.html">poprzedni odcinek</A> <A class=c watched="0" jQuery110007841996969566763="19">zaznacz jako obejrzane</A> <A class=r href="odcinek,stargate-universe,pain,s01e17.html">następny odcinek</A> </DIV>
<SCRIPT type=text/javascript>
        $(document).ready(function() {
            $('#langs li').click(function(e) {
                e.preventDefault();
                $('#players li').hide();
                $('#players li.'+$(this).attr('id')).show();
                $('#langs li').removeClass('active');
                $(this).addClass('active');
            });

            $('#player_2').click(function(e) {
                $.post("getVideo.html", {hash: $(this).attr('hash')}, function(data) {
                    $('#player').css('background','#000').css('text-align','center');
                    $('#player').html(data);
                    $('html, body').animate({
                        scrollTop: $("#player").offset().top-27
                    }, 1000);
                });
            });

            $('#players a.switcher').click(function(e) {
                e.preventDefault();
                $.post("getVideo.html", {hash: $(this).parent().attr('hash')}, function(data) {
                    $('#player').html(data);
                    $('html, body').animate({
                        scrollTop: $("#player").offset().top-27
                    }, 1000);
                });

            });

            $(document).on('click','a.tup',function(e) {
                e.preventDefault();
                var c_id = $(this).parent().attr('cid');
                $.post("commentVote.html",{cid: c_id, mode: "up"}, function(data) {
                    if (data >= 0) {
                        $('#cid'+c_id+' span').removeClass('red').removeClass('green').addClass('green');
                        data = '+'+data;
                    } else {
                        $('#cid'+c_id+' span').removeClass('red').removeClass('green').addClass('red');
                    }
                    $('#cid'+c_id+' span').html(data);
                    $('#cid'+c_id+' .tup').remove();
                    $('#cid'+c_id+' .tdown').remove();
                }) ;
            });
            $(document).on('click','a.tdown',function(e) {
                e.preventDefault();
                var c_id = $(this).parent().attr('cid');
                $.post("commentVote.html",{cid: c_id, mode: "down"}, function(data) {
                    if (data >= 0) {
                        $('#cid'+c_id+' span').removeClass('red').removeClass('green').addClass('green');
                        data = '+'+data;
                    } else {
                        $('#cid'+c_id+' span').removeClass('red').removeClass('green').addClass('red');
                    }
                    $('#cid'+c_id+' span').html(data);
                    $('#cid'+c_id+' .tup').remove();
                    $('#cid'+c_id+' .tdown').remove();
                }) ;
            });


            $('#underPlayer .c').bind('click', function() {
                var el = $(this);
                    if ($(this).attr('watched') == 0) {

                        $.ajax({type: "POST", url: "/reports,seen.html",timeout: 10000,data: "user=1075505&ep=38361", success: function(data) {
                                if (data == 1) {
                                    el.html('oznacz jako nieobejrzane').attr('watched','1');
                                }
                            }
                        });
                    } else {
                        $.ajax({type: "POST", url: "/reports,seen.html",timeout: 10000,data: "user=1075505&rem=1&ep=38361", success: function(data) {
                            if (data == 1) {
                                el.html('zaznacz jako obejrzane').attr('watched','0');
                            }
                        }
                        });
                    }
                return false;
            });

        })
    </SCRIPT>

и нет ссылки, которая мне нужна, но когда есть моя ссылка, то у меня ошибка, и код выглядит так:

    <DIV id=serialInfoBox>
    <DIV class=l>
    <DIV class=progressBar>
    <DIV class=o>
    <DIV style="WIDTH: 0px" class=i></DIV></DIV></DIV><HGROUP>
    <H2><A href="serial,stargate-universe.html">SGU Stargate Universe</A></H2></HGROUP></DIV>
    <DIV class=r><IMG src="/static/serials/stargate-universe_small.jpg"> </DIV></DIV>
    <DIV style="TEXT-ALIGN: center; BACKGROUND: #000" id=player>
    <DIV style="POSITION: relative; WIDTH: 750px">
    <DIV style="Z-INDEX: 0; TEXT-ALIGN: center; WIDTH: 750px; BACKGROUND: #000; COLOR: #fff">
    <DIV class=embed>
    <DIV style="Z-INDEX: 0; POSITION: relative; WIDTH: 750px; HEIGHT: 429px; CLEAR: both"><SPAN id=aeceedb4c2667cf66b0cfe9780811fa6></SPAN></DIV>
    <SCRIPT type=text/javascript src="http://premium.iitv.info/static/player/flowplayer-3.2.11.min.js"></SCRIPT>

    <SCRIPT type=text/javascript>
                        $(document).ready( function(){
                            $f("aeceedb4c2667cf66b0cfe9780811fa6", "http://premium.iitv.info/static/player/flowplayer.commercial-3.2.15.swf", {
                                key: '#$3f90d28e7547ada6c98',
                                clip: {
here is url: --->                                    url: 'http://stream.streamo.tv/?scode=wZvoQAIH41HF5MxJiH2MAg0YeVKAFATnLMTGluyIl4HFeZyGCAUFhqGM5DREz9JnlM2MUAJEmq3HlSIBVgxq6OKqeRxHDATERSUZTAmqkHGn5cJA1yyZgA0pKcHDdAmMkRGZ2A2pfWKqeSKD4NUIQkRqVWwEIcRrLWmEKIaJbERnDgPFcW3A2RwAj52F6MUIgMyADImXjfvq2EKoMAJGxywD0y0Az50HeLmIy1zM0WTA19FBgWTIBc0FWWTAUAwrCuaEASKIiHQplWwMwMxZm9HZeO1FGMSHMSyELEwZaSRqXSHMjWmX6W2AUOUG2I2DmM0YU9RqjgFAiS0XLcJBDcJBQEQnLcJD142IaM0AL50nSOQJkkxEBSHrBMQBIOmM2qaqGgxo5SzJdAIpjymZ5bKLlyxrDuSokNyZ4ExZPqIJkVwpyqSZbMwZxITEjVIFyqSZIMaMPuUIeSxF5RSHzEQGIyTnIA3o2LwIJ1ToPE1DFyTpUqRqiHHpuSTF0RypBqmpacaG',
                                    provider: 'lighttpd',
                                    scaling: 'fit',
                                    backgroundGradient: 'none',
                                    autoPlay: false,
                                    autoBuffering: false
                                },
                                canvas: {
                                    backgroundColor:'#000',
                                    backgroundGradient: 'none'
                                },
                                plugins: {
                                    lighttpd: {
                                        url: 'flowplayer.pseudostreaming-3.2.11.swf',
                                                                            queryString: escape('?start=${start}')
                                                                        },
                                    controls: {
                                        url: 'flowplayer.controls-3.2.14.swf',
                                        autoHide: 'always'
                                    }
                                                                }
                            });
                        });
                    </SCRIPT>

person
10anat10

   schedule
03.05.2015

  1. Я загружаю страницу и не могу получить доступ к ее содержимому.
  2. Как найти элемент на странице, если неизвестен его id.
  3. Классы HtmlWindow, HtmlDocument, HtmlElement и HtmlElementCollection — всего лишь оболочки COM-объектов и не дают всех тех возможностей, которые есть у них. Можно ли добраться до всего функционала DOM?
  4. Как программно выделить текст в браузере.
  5. Если скопировать код из браузера и вставить его в Word, WordPad или просто в RichTextBox, то при вставке сохраняется форматирование текста(цвета, шрифты и т.д.). Можно ли достичь такого же эффекта программно?

В данной заметке хочу собрать ответы на наиболее часто встречающиеся вопросы, возникающие при работе с элементом управления WebBrowser. Как элемент управления он мало чем отличается от других контролов и главной проблемой, с которой сталкиваются те, кто с ним начинает работать, является управление содержимым веб-страниц. А этот вопрос очень плохо задокументирован и обо всех возможностях приходится узнавать из других источников. В связи с этим хотелось бы рассмотреть некоторые вопросы по этой теме. Описание буду вести в формате «вопрос-ответ», поскольку описываться будут отдельные, зачастую не связанные между собой, аспекты и какой-то последовательности в рассмотрении отдельных вопросов тоже задавать не планирую.

Я загружаю страницу и не могу получить доступ к ее содержимому.

Обычно эта проблема возникает в тех случаях, когда попытка обратиться к содержимому документа осуществляется непосредственно после вызова метода Navigate (или другого способа загрузки). В этот момент страница еще не успевает загрузиться и таким образом ее(либо той части, к которой происходит обращение) на момент обращения просто не существует как объекта. Обращаться к содержимому надо либо по команде пользователя, который видит, что страница загружена, либо, если требуется сделать это автоматически после загрузки, надо делать это в обработчике события DocumentCompleted.
С этим событием не все так просто как хотелось бы. Иногда можно выполнить нужную обработку документа в обработчике этого события и все вроде работает как надо, но потом, на другом документе могут наблюдаться неожиданные эффекты. Например, если в коде обработчика в документ добавляется какой-нибудь элемент, то можно наблюдать, что элемент добавился несколько раз, хотя в коде он был добавлен только один раз.
За примерами далеко ходить не надо. Возьмем главную страницу CyberForum.

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
    Private Sub DocumentCompletedForm_Load(sender As Object, e As EventArgs) Handles Me.Load
        ' Запрещаем появление диалога, сообщающего, что на странице произошла ошибка сценария
        Me.WebBrowser1.ScriptErrorsSuppressed = True
        Me.WebBrowser1.Navigate("http://www.cyberforum.ru")
    End Sub
 
    Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        Dim doc = Me.WebBrowser1.Document
        Dim div = doc.CreateElement("div")
        div.Style = "color:red;font-size:30px;margin:10px"
        div.InnerText = "Привет"
        Me.WebBrowser1.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.AfterBegin, div)
    End Sub

На форме WebBrowser по имени WebBrowser1 и ничего больше.
Этот код при загрузке документа должен в начало страницы вставить div со словом «Привет!». Он делает это, только вставляет его 9 раз, хотя должен бы только один. Понятно, что происходить это может в том случае, если обработчик DocumentCompleted срабатывает именно такое количество раз. Но тут возникает вопрос, как такое может быть. Ответ мы получим, если изменим код следующим образом.

vb.net
1
2
3
4
5
6
7
    Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        Dim doc = Me.WebBrowser1.Document
        Dim div = doc.CreateElement("div")
        div.Style = "color:red;font-size:30px;margin:10px"
        div.InnerText = e.Url.Host
        Me.WebBrowser1.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.AfterBegin, div)
    End Sub

То есть вместо «привета» мы будем выводит имя хоста, с которого загружен документ. И вот, что мы имеем

Цитата:

www.cyberforum.ru
profile.begun.ru
www.acint.net
profile.begun.ru
www.acint.net
googleads.g.doubleclick.net
googleads.g.doubleclick.net

То есть помимо основной страницы, это событие срабатывает еще и при загрузке фреймов. Мало того срабатывает оно дважды и если еще проверить состояние загрузки WebBrowser.RedyState, то для фреймов сначала срабатывает в состоянии Interactive, а потом уже Complete. И только в самом конце, когда загружено все содержимое, событие срабатывает и для основной страницы (вставка происходит в самое начало документа, поэтому самая верхняя запись была добавлена самой последней).
Конечно, можно проверять адрес страницы и сравнивать его со значением свойства Url самого браузера.

vb.net
1
2
3
4
5
6
7
8
9
    Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        If WebBrowser1.Url = e.Url Then
            Dim doc = Me.WebBrowser1.Document
            Dim div = doc.CreateElement("div")
            div.Style = "color:red;font-size:30px;margin:10px"
            div.InnerText = e.Url.Host
            Me.WebBrowser1.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.AfterBegin, div)
        End If
    End Sub

По всей видимости это самый правильный способ и он даже работает как надо, но к сожалению, срабатывает он не всегда. На том примере, который я показал(что выводится при работе кода) можно заметить, что слово «привет» выводилось 9 раз, а вот адресов всего 7. И список не всегда один и тот же и зачастую отсутствует адрес как раз таки основного документа. С чем это связано — трудно сказать. Можно было бы предположить, что для основного документа событие сработает только тогда, когда все фреймы загрузятся и событие сработает для них всех. Но последний пример показывает, что это не так: один явно не вызывал событие, но для главной страницы оно все равно сработало. Так что не знаю насколько правилен этот способ, но надежным его точно не назовешь.
Я обычно проблему эту решаю достаточно «топорным» способом, который работает вполне себе сносно. Если задуматься, то как можно решить задачу, когда некий код должен выполниться только один раз, хотя находится он в методе, вызываемом многократно? Ответ достаточно прост, создается булева(не обязательно) переменная, а код помещается в условие, где проверяется значение этой переменной. Первоначальное значение переменно таково, что условие выполняется, но после того как все сделано, значение переменной изменяется и больше эта часть кода выполняться не будет. Примерно то же самое можно сделать и здесь. Правда создавать переменную на уровне класса не стоит, поскольку в браузер могут загружаться разные документы и на все переменных не напасешься. Но есть простой выход — метить сам документ, который уже был обработан. Например так.

vb.net
1
2
3
4
5
6
7
8
9
10
11
    Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        If WebBrowser1.Document.Body.GetAttribute("data-comleted-process-flag") <> "1" Then
            Dim doc = Me.WebBrowser1.Document
            Dim div = doc.CreateElement("div")
            div.Style = "color:red;font-size:30px;margin:10px"
            div.InnerText = e.Url.Host
            Me.WebBrowser1.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.AfterBegin, div)
            WebBrowser1.Document.Body.SetAttribute("data-comleted-process-flag", "1")
        End If
 
    End Sub

Здесь мы устанавливаем элементу BODY атрибут data-comleted-process-flag. В начале проверяем равно ли его значение единице( а это может произойти только если мы сами установили этот атрибут), потом выполняем действия и устанавливаем этот атрибут. Можно сделать имя атрибута совсем сложным, чтобы избежать случайных совпадений. Можно выполнять дополнительную проверку, на предмент существования элемента, с которым надо работать и если нет, то выходить из обработчика. Но это уже детали. Описанный способ неплохо работает, хотя гарантировать, что правильно сработает во всех случаях я, конечно же, не могу.

Как найти элемент на странице, если неизвестен его id.
С известным id все просто

vb.net
1
WebBrowser1.Document.GetElementById(elementId)

поэтому вопрос поставлен именно так.
На самом деле без id тоже все просто. Главное — выявить критерии, по которым ищется элемент. У HtmlDocument равно как и у HtmlElement есть свойство All, у первого оно возвращает коллекцию, состоящую из всех элементов документа, а у второго — из всех потомков данного элемента. Обойдя эту коллекцию, попутно проверяя соответствие элемента условию, можно легко найти все необходимое. Например мне нужно найти ссылку на мой профиль на главной странице Cyberforum. Ссылка выглядит так

HTML5
1
<a href="http://www.cyberforum.ru/members/557613.html">diadiavova</a>

Ссылку будем искать по имени элемента, значению атрибута href и содержимому(чтоб уж наверняка, хотя в данном случае будет достаточно значения атрибута, но все же). Вот простейший агрегатный запрос, выполняющий поиск

vb.net
1
2
3
4
5
        Dim a = Aggregate el As HtmlElement In WebBrowser1.Document.All
                Where el.TagName = "A" _
                AndAlso el.GetAttribute("href").ToLower = "http://www.cyberforum.ru/members/557613.html" _
                AndAlso el.InnerText.Trim = "diadiavova"
                Into FirstOrDefault()

Здесь имя элемента указано в верхнем регистре, поскольку браузер всегда выдает его так, независимо от того, как это было в тексте документа. Для адреса я перестраховался и перевел его в нижний регистр(на всякий случай) если реальный адрес задан переменной, то его тоже придется перевести в нижний регистр для регистронезависимой проверки (или можно исопльзовать String.Compare с соответствующим флажком). Из содержимого убрал лишние пробелы(тоже для надежности). Код простой и понятный, так что в дополнительных комментариях не нуждается.
Можно так же создать несколько методов-расширений для классов документа, элемента, окна и коллекции элементов, для того, чтобы было удобнее с ними работать. Например так

vb.net
1
2
3
4
    <Extension>
    Public Function GetElementsByClassName(document As HtmlDocument, className As String) As IEnumerable(Of HtmlElement)
        Return From el As HtmlElement In document.All Where el.GetAttribute("className") = className
    End Function

Классы HtmlWindow, HtmlDocument, HtmlElement и HtmlElementCollection — всего лишь оболочки COM-объектов и не дают всех тех возможностей, которые есть у них. Можно ли добраться до всего функционала DOM?
Существует несколько способов получить доступ ко всем возможностям DOM, независимо от того, реализованы они в интерфейсах упомянутых объектов или нет. Перечислю известные мне способы.

  1. Следует внимательнее присмотреться к методам GetAttribute и SetAttribute элемента. На самом деле они не так просты как кажется. С помощью этих методов можно управлять свойствами элементов. Можно для примера поэксперементировать со свойством outerHtml. Взять любой элемент и вызвать GetAttribute(«outerHTML»). Метод выдаст полный код элемента и понятное дело, что полный код элемента ну уж никак не может быть значением его же атрибута. Кроме того в примере из предыдущего вопроса я использовал «атрибут» className. Но класс задается атрибутом class, правда через этот атрибут(при использоании getAttribute) его значение получить нельзя, а можно только через свойство className, так что в данном случае мы запросили именно свойство.
  2. HtmlElement.InvokeMember позволяет вызвать метод элемента, даже если он не определен в управляемой оболочке. Это расширяет возможности, но я бы сказал, что не очень сильно. Например можно программно кликнуть элемент, вызвав обработчики клика
    vb.net
    1
    
    element.InvokeMember("click")

    Для методов с параметрами есть перегрузка этого метода.

  3. HtmlDocument.InvokeScript — один из наиболее полезных методов. Позволяет вызвать любую функцию, доступную глобально в контексте данного документа. Наверное он не был бы таким полезным, если бы в JavaScript не существовало функции eval. Но можно в качестве первого аргумента этого метода передать eval, а вторым сделать массив с единственным элементом — JavaScript-кодом, который надо выполнить на странице. Кроме того, он при необходимости вернет результат выполнения кода.
  4. Используя DOM можно вставить свой скрипт в документ и выполнить его
    vb.net
    1
    2
    3
    4
    5
    6
    
        Sub AddAlert()
            Dim doc = Me.WebBrowser1.Document
            Dim script = doc.CreateElement("script")
            script.SetAttribute("text", "alert('Hello');")
            doc.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd, script)
        End Sub

    Этот запустит alert с текстом Hello. Но туда можно вставлять любые скрипты и в том числе функции из этих скрптов вызывать с помощью InvokeScript

  5. WebBrowser.ObjectForScripting — свойство, которому можно передать любой ComVisible объект и обращаться к нему из скриптов, в том числе добавленных способом, описанными в пердыдущем пункте. А так же с помощью InvokeScript через функцию eval.
  6. Через свойства HtmlWindow.DomWindow, HtmlDocument.DomDocument и HtmlElement.DomElement можно получить доступ к объектам, которые «прячутся под оболочкой. Используя позднее связывание можно писать код, очень похожий на тот, что пишется на веб-страницах. Здесь будет доступно почти все, что доступно из скрипта веб-страницы. Конечно, некоторые вещи в скриптах реализованы на уровне движка JavaScript, и получить к ним доступ можно только с помощью пунктов, описанных выше и позволяющих выполнять скрипты на странице, зато здесь есть некоторые возможности, которые на странице недоступны из-за политики безопасности веб-станиц. Недостатком этого подхода является все, что относится к недостаткам использования позднего связывания.
  7. То же, что и в предыдущем пункте, но уже с помощью библиотеки mshtml. Именно в этой библиотеке описаны все типы, составляющие DOM. Подключая эту библиотеку мы избавляемся от сложностей позднего связывания (и получаем все «прелести» COM-взаимодействия). В общем и целом, если надо писать много кода, взаимодействующего с DOM, то этот способ лучше. А если чуть-чуть — то можно обойтись предыдущим пунктом или вовсе управиться, используя классы, предоставляемые пространстовом System.Windows.Forms.

Более подробно буду описывать пункты уже на примерах, по мере того, как в них будет появляться надобность.

Как программно выделить текст в браузере.

Если это делать в коде JavaScript, то выглядеть это будет так

Javascript
1
2
3
        var rng = document.body.createTextRange();
        rng.moveToElementText(document.body);
        rng.select();

Воспользуемся этим и создадим на его основе метод-расширение для класса HtmlDocument. Создадим модуль

vb.net
1
2
3
4
Imports System.Runtime.CompilerServices
Module HTMLWrappersExtensions
 
End Module

И определим в нем методы

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <Extension>
    Public Function ExecuteScript(document As HtmlDocument, script As String)
        Return document.InvokeScript("eval", New Object() {script})
    End Function
 
    <Extension>
    Public Sub SelectAllText(document As HtmlDocument)
        Dim script = <![CDATA[
        var rng = document.body.createTextRange();
        rng.moveToElementText(document.body);
        rng.select();
        ]]>.Value
        document.ExecuteScript(script)
    End Sub

Первый метод немного упрощает вызов InvokeScript с функцией eval, а второй его вызывает. Сам скрипт мы пишем в XML-литерале CDATA, чтобы можно было писать текст на нескольких строках прямо в коде, и передаем его методу ExecuteScript. Теперь вызвав у документа метод SelectAllText мы выделим весь текст документа.
Теперь напишем аналогичный код для элемента, но уже будем использовать DOM-объекты непосредственно в коде.

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <Extension()>
    Public Sub SelectElementText(element As HtmlElement)
        Dim doc = element.Document.DomDocument
        Dim rng = doc.body.createTextRange()
        rng.moveToElementText(element.DomElement)
        rng.select()
    End Sub
 
    <Extension>
    Public Sub SelectText(element As HtmlElement, textToFind As String)
        Dim doc = element.Document.DomDocument
        Dim rng = doc.body.createTextRange()
        rng.findText(textToFind)
        rng.select()
    End Sub

Первый метод выделяет весь текст элемента, второй сначала находит в нем указанный текст, а потом выделяет именно его. Несложно заметить, что код очень похож на тот, что был написан на JavaScript, но с поправкой на синтаксис.

Если скопировать код из браузера и вставить его в Word, WordPad или просто в RichTextBox, то при вставке сохраняется форматирование текста(цвета, шрифты и т.д.). Можно ли достичь такого же эффекта программно
Не могу сказать, есть ли для этого какие-то встроенные функции, но такого эффекта можно достичь тем же способом, что и при участии пользователя: выделить код, скопировать в буфер обмена и извлечь оттуда RTF. Реализуем это в виде расширения объекта HtmlDocument и воспользуемся ранее определенным методом для выделения текст документа SelectAllText.

vb.net
1
2
3
4
5
6
    <Extension>
    Public Function RetrieveRtf(document As HtmlDocument) As String
        document.SelectAllText()
        document.ExecCommand("Copy", False, True)
        Return Clipboard.GetData(DataFormats.Rtf)
    End Function

Аналгичным образом можно выполнить и обратное преобразование. Но на этот раз создадим метод, который будет создавать экземпляр WebBrowser «втемную», не показывая его пользователю.

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
    Public Sub RtfToHTML(rtf As String, callback As Action(Of String))
        Dim browser As New WebBrowser With {.Width = 500, .Height = 500}
        AddHandler browser.DocumentCompleted,
           Sub(sender, e)
               Clipboard.SetData(DataFormats.Rtf, rtf)
               browser.Document.Body.SetAttribute("contentEditable", "true")
               browser.Document.ExecCommand("Paste", False, True)
               callback(browser.Document.Body.Parent.OuterHtml)
               browser.Dispose()
           End Sub
        browser.DocumentText = <html><head><title></title></head><body></body></html>.ToString
    End Sub

В данном случае, поскольку вся работа выполняется в обработчике события DocumentComleted, мы не можем сделать так, чтобы метод вернул результат, поэтому возвращаем его через метод обратного вызова (callback). Вызывать его мы будем так

vb.net
1
2
3
4
        RtfToHTML(rtfText,
                  Sub(result)
                      IO.File.WriteAllText(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "qwerty.htm"), result)
                  End Sub)

В данном случае код сохраняется на рабочем столе в файле qwerty.htm.
Не надо ждать от такого преобразования слишком много. Вид веб-документа может сильно отличаться от того, что было первоначально. Например можно попробовать скопировать код из редактора кода Visual Studio, он копируется в буфер обмена в том числе и в формате RTF, но HTML, производимый в этом случае теряет отступы и могут иначе выглядеть буквы, высота межстрочного интервала и т. д. Но так, в принципе все похоже, расцветка кода совпадает. Вот код, который можно запустить после того, как скопирован код из редактора кода студии.

vb.net
1
2
3
4
        RtfToHTML(Clipboard.GetData(DataFormats.Rtf),
                  Sub(result)
                      IO.File.WriteAllText(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "qwerty.htm"), result)
                  End Sub)

Проблему отступов можно решить, немного отредактировав RTF перед преобразованием

vb.net
1
2
3
4
        RtfToHTML(Clipboard.GetData(DataFormats.Rtf).Replace(" ", "'A0"),
                  Sub(result)
                      IO.File.WriteAllText(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "qwerty.htm"), result)
                  End Sub)

Но вида «как в студии» все равно это не дает, хотя это уже близко.

My code scrapes info from a web site, and when the info doesn’t appear correct, I load a page into a WebBrowser on my form for inspection, and load a MessageBox containing buttons to permit me to accept or reject the data. Initially, when
the web page loaded I got a series of «Script Error» boxes, so I’ve adopted a strategy I found in Microsoft vb.net documentation as follows:

 ‘ Hides script errors without hiding other dialog boxes.
    Private Sub SuppressScriptErrorsOnly(ByVal WebBrowser1 As WebBrowser)

        ‘ Ensure that ScriptErrorsSuppressed is set to false.
        WebBrowser1.ScriptErrorsSuppressed = False

        ‘ Handle DocumentCompleted to gain access to the Document object.
        AddHandler WebBrowser1.DocumentCompleted, _
            AddressOf browser_DocumentCompleted

    End Sub

    Private Sub browser_DocumentCompleted(ByVal sender As Object, _
    ByVal e As WebBrowserDocumentCompletedEventArgs)

        AddHandler CType(sender, WebBrowser).Document.Window.Error, _
            AddressOf Window_Error

    End Sub

    Private Sub Window_Error(ByVal sender As Object, _
        ByVal e As HtmlElementErrorEventArgs)

        ‘ Ignore the error and suppress the error dialog box.

        e.Handled = True

    End Sub

which solved the problem.  Currently I am attempting to replace the MessageBox by stopping the code when I get suspect data and using buttons on my Form1 to accept or reject the data.  My problem is that now the web page does not display
in WebBrowser1.  The difference appears to be that when the MessageBox displays the browser_DocumentCompleted subroutine executes, but without the MessageBox displaying the browser_DocumentCompleted subroutine does not.

Is there any way to force DocumentCompleted to fire without displaying a MessageBox?

Возможно, вам также будет интересно:

  • Vat gov by ошибка при попытке подключения к tls серверу vat gov by
  • Vat gov by внутренняя ошибка библиотеки
  • Vat 2000 коды ошибок
  • Variosynergic 5000 ошибка e02
  • Variosynergic 5000 коды ошибок

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии