Выполнение действия webbrowsersettings ошибка обращения к instance setproxy

Ошибки в логе | TermiDroid

Войти или зарегистрироваться

Ошибки в логе

Тема в разделе «Разбор ошибок», создана пользователем SlimperMan, 9 июн 2018.


  1. SlimperMan

    SlimperMan
    New Member

    Прошу объяснить причину появляющихся ошибок и действия, которые необходимо предпринять при их появлении:

    1. Выполнение действия WebBrowserTabManagement Ошибка обращения к Instance.GetTabByAddress
    2. Выполнение действия WebBrowserSettings Ошибка обращения к Instance.SetProxy
    3. Выполнение действия WebBrowserTab Ошибка обращения к Instance.ActiveTab
    4. Выполнение действия Emulation Ошибка обращения к Instance.SendText


    SlimperMan,
    9 июн 2018

    #1

    Ответить

Ответить в теме

Показать игнорируемое содержимое

Поделиться этой страницей

Ваше имя или e-mail:
У Вас уже есть учётная запись?
  • Нет, зарегистрироваться сейчас.
  • Да, мой пароль:
  • Забыли пароль?

Запомнить меня


TermiDroid

Поиск

  • Искать только в заголовках
Сообщения пользователя:

Имена участников (разделяйте запятой).

Новее чем:
  • Искать только в этой теме
  • Искать только в этом разделе
    • Отображать результаты в виде тем

Быстрый поиск

  • Последние сообщения

Больше…

Ошибки в логе | TermiDroid

Войти или зарегистрироваться

Ошибки в логе

Тема в разделе «Разбор ошибок», создана пользователем SlimperMan, 9 июн 2018.

  1. SlimperMan
    New Member

    Прошу объяснить причину появляющихся ошибок и действия, которые необходимо предпринять при их появлении:

    1. Выполнение действия WebBrowserTabManagement Ошибка обращения к Instance.GetTabByAddress
    2. Выполнение действия WebBrowserSettings Ошибка обращения к Instance.SetProxy
    3. Выполнение действия WebBrowserTab Ошибка обращения к Instance.ActiveTab
    4. Выполнение действия Emulation Ошибка обращения к Instance.SendText

Ответить в теме

Показать игнорируемое содержимое

Поделиться этой страницей

Ваше имя или e-mail:
У Вас уже есть учётная запись?
  • Нет, зарегистрироваться сейчас.
  • Да, мой пароль:
  • Забыли пароль?

Запомнить меня

Поиск

  • Искать только в заголовках
Сообщения пользователя:

Имена участников (разделяйте запятой).

Новее чем:
  • Искать только в этой теме
  • Искать только в этом разделе
    • Отображать результаты в виде тем

Быстрый поиск

  • Последние сообщения

Больше…

Саня

Сообщения: 1
Зарегистрирован: 01 апр 2020, 07:08

Не получается запустить C#

работаю с Демо не получается запустить C# в таком виде
var elementTools = instance.ActiveTab.FindElementByAttribute(«strong», «innertext», «Мой\ профиль», «regexp», 0);
if (!elementTools.IsVoid)
{
instance.WaitFieldEmulationDelay();
elementTools.RiseEvent(«click», instance.EmulationLevel);
instance.ActiveTab.WaitDownloading();
return «»;
}
Это кот я взял из другой программы Там он работает а здесь у меня не получается что я делаю не так


Аватара пользователя

Support

Site Admin
Сообщения: 996
Зарегистрирован: 10 апр 2009, 17:45
Контактная информация:

Re: Не получается запустить C#

Сообщение

Support » 01 апр 2020, 13:47

Нет необходимых библиотек для работы этого кода.

Подключите XHE.dll к проекту через Visual Studio и пишите скрипт там, если эта программа предоставляет такие библиотеки.

А вообще этот код легко переписывается через наш фреймворк.


Oleg1987

Сообщения: 4
Зарегистрирован: 21 фев 2020, 18:15

Re: Не получается запустить C#

Сообщение

Oleg1987 » 07 апр 2020, 23:37

Так это api зеннопостера. С чего оно должно работать в human?


This topic has been deleted. Only users with topic management privileges can see it.

  • Здраствуйте, реально ли совершать клик по объекту зная его class и его порядковый номер (если не один)


  • попробуй как здесь http://wiki.bablosoft.com/doku.php?id=ru:tutorial2
    только вместо парсить,
    узнай css, удали лишнее, и кликай


  • @No именно так все и устроенно! Порядок такой — нажимаем на нужный объект левой кнопкой мыши — выбираем — двигать мышь и кликнуть на элемент — и выбираешь match (существует три вида клика — по css — по тексту match — b по координатам
    0_1475749790624_2016-10-06_212813.png


  • @Turutur Ну match я видел. Только вот не будет работать если кнопок три и мне нужно кликнуть на вторую, а скрипт кликнет только на первую.
    Получается нужен более продвинутый конструктор?
    Например на с# этот клик я могу сделать этим кодом
    HtmlElement he = instance.ActiveTab.GetDocumentByAddress(«0»).FindElementByTag(«form», 1).FindChildByAttribute(«span», «class», «b-combo__arrow», «text», 0);
    if (he.IsVoid) return -1;
    Можно ли этот код внедрить в BAS ?


  • Ну мой главный вопрос: Реально ли подобный код перенести в BAS ?
    HtmlElement he = instance.ActiveTab.GetDocumentByAddress(«0»).FindElementByTag(«form», 1).FindChildByAttribute(«span», «innertext», «Переводы», «regexp», 0);
    if (he.IsVoid) return -1;
    Если нельзя. Можно ли как сделать чтобы объект для клика искался по «innertext» или «innerhtml» ?


  • @No человек — да ты продвинутый юзер — не пугай меня кодом — не мой уровень — где то видел выполнить код — Жди поддержку @support — или может еще кто шарит. Извиняй — не смог помочь. Если тема не палевая — запости пожалйста скрин и пример — может пригодится — я не встречал проблем с кликом по элементам….


  • Ну я знаю лишь азы С#, и код этот я беру с другого софта на подобии BAS.
    Вот я и привык там кликать только по элементам (там по CSS кликать вроде бы и нельзя)и мне кажется что так удобней работать.
    Например софт который кликает по значению «innertext» ,по идеи, должен быть рабочим дольше чем клики по css


  • @No это дело — привычки — я сам слез с «зенки» — BAS больше нравиться — хотя еще в стадии разработки и да некоторые элементы реализованы » не так» — после использования «другого софта» — просто нужно смириться и понять здешний алгоримт)


  • @No

    Здраствуйте, реально ли совершать клик по объекту зная его class и его порядковый номер (если не один)

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

    Например, 3 ссылка a<2>
    или сслыка в цикле a<[[CYCLE_INDEX]]>


  • @No

    HtmlElement he = instance.ActiveTab.GetDocumentByAddress(«0»).FindElementByTag(«form», 1).FindChildByAttribute(«span», «class», «b-combo__arrow», «text», 0);

    В БАС это будет так

    page().all("form").at(0).css("span.b-combo__arrow").text()!
    [[RESULT_TEXT]] = _result()
    

    Нужно вставлять в действие выполнить код


  • @No

    По innerHTML можно кликать так, как показал @Turutur http://community.bablosoft.com/post/2265


  • В будущем также планируется конструктор запросов, вроде конструктора для логических выражений, которые есть сейчас.


  • «По innerHTML можно кликать так, как показал @Turutur http://community.bablosoft.com/post/2265»

    @support можете, пожалуйста, привести?


  • @No Ну берете весь код элемента или кусок кода, вставляете в поле, выбираете match вместо css, как показано на картинке. И происходит поиск по innerHTML


  • @support said in Как кликать по HTML а не CSS:

    вроде конструктора для логических выражений, которые есть сейчас

    @support — пожалуйста сделайте возможность в конструкторе регулярок — сразу переходить на страницу теста.

    зачем: допустим — делал регулярку общую к каким то данным с разных страниц — то есть универсальную — например регулярка которая вытаскивает прокси и порты, ссылки и так далее — она сохранена в файл — и чтобы не тратить время на создание регулярки через констрктор при тесте — сразу проверить работает ли сохраненная регулярка или полученная с другого источника


  • @Turutur Таких сервисов полно. Например, https://regex101.com/


  • @support например у меня есть такой код
    <span class=»b-combo__item-inner» dbid=»46″ dbprid=»3″ style=»cursor:pointer»>Автомобили</span>

    Можно ли кликнуть используя только эту часть, ибо всё остальное не постоянное. (Не получается так)
    style=»cursor:pointer»>Автомобили</span>


  • @No Можно сайт, я бы попробовал.


  • @support Я думаю только вы сможете разобраться в этой ситуации)
    Есть страница https://www.fl.ru/projects/ Тут нужно выбрать с выпадающего списка 2 категории, не важно какие, ну пускай это будет «Тексты: Статьи»
    Можно конечно по простому сделать
    alt text
    Но тогда нельзя будет просто перестроить скрипт например на» Разработка игр: 3D Моделирование» А вот если бы клики происходили по innerHTML, то тогда было бы лишь достаточно изменить данные в переменной и скрипт бы кликал по нужным категориям.
    Как подсказал @Canine , можно сделать клик указав просто текст без кода.
    alt text
    Но тогда вторую подкатегорию выбрать не получиться.
    Что можете посоветовать?


  • @No А если просто через ввод написать то что нужно оно вроде выбирает 0_1475782499389_постинг.png
    0_1475782625517_тест ввод.xml


  • rashk1n

    0 / 0 / 0

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

    Сообщений: 13

    1

    Ошибка: Отсутствует внешняя точка для выхода из цикла или продолжения

    08.01.2016, 13:58. Показов 4528. Ответов 4

    Метки нет (Все метки)


    Выходит ошибка:
    «Отсутствует внешняя точка для выхода из цикла или продолжения». [Строка: 11; Cтолбец: 3]

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    {
        var postscollection = instance.ActiveTab.FindElementsByAttribute("div","onclick","wall.postClick","regexp");
        try {instance.ActiveTab.FindElementByAttribute("a","id","wall_more_link","regexp",0).Click();}
        catch{}
        currentCount = postscollection.Count;
        if (currentCount == lastCount)
        {   
            break;
        }
        lastCount = postscollection.Count;
        System.Threading.Thread.Sleep(2000);
    }

    Добавлено через 1 час 56 минут
    на break ошибку выдает

    __________________
    Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

    0

    Эксперт .NET

    5856 / 4733 / 2940

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

    Сообщений: 8,361

    08.01.2016, 14:01

    2

    rashk1n,
    Нужно больше кода, ибо непонятно, что там до и после фигурных скобок.

    0

    rashk1n

    0 / 0 / 0

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

    Сообщений: 13

    18.01.2016, 12:47

     [ТС]

    3

    код в zennoposter

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    var currentCount = 0; // текущее кол-во постов на странице
    var lastCount = 0;  // последнее значение кол-ва постов после скролла
     
    // пока текущее количество постов < чем перменная post_min
    while(currentCount<Convert.ToInt32(project.Variables["post_min"].Value));
    {
        // собираем коллекцию всех постов
        var postscollection = instance.ActiveTab.FindElementsByAttribute("div","onclick","wall.postClick","regexp");
        //пробуем кликнуть на дозагрузку элементов
        try {instance.ActiveTab.FindElementByAttribute("a","id","wall_more_link","regexp",0).Click();}
        catch{}
        
        currentCount = postscollection.Count;
        // проверяем изменилось ли кло-во элементов с момента последнего выполнения цикла
        if (currentCount>=lastCount)
        {
            break;
        }
        
        lastCount = postscollection.Count;
        System.Threading.Thread.Sleep(2000);
        
    }

    0

    Даценд

    Эксперт .NET

    5856 / 4733 / 2940

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

    Сообщений: 8,361

    18.01.2016, 14:55

    4

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

    Решение

    rashk1n,
    в 5-й строке уберите точку с запятой.

    C#
    1
    2
    3
    4
    
    while(currentCount<Convert.ToInt32(project.Variables["post_min"].Value))
    {
       //...
    }

    Иначе в цикле будет крутиться только пустой оператор. А весь код в строках 6-23 будет вне цикла и брику неоткуда выходить.

    1

    0 / 0 / 0

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

    Сообщений: 13

    18.01.2016, 15:20

     [ТС]

    5

    Даценд, благодарю! не внимателен был.

    0

    Type Array
    Mandatory No
    Manifest version 2 или выше
    Example
    "permissions": [
      "webRequest"
    ]

    Используйте ключ permissions чтобы запросить специальные полномочия для вашего расширения. Этот ключ представляет собой массив строк, и каждая строка представляет собой запрос разрешения.

    Если вы запрашиваете разрешения с помощью этого ключа, тогда браузер может сообщить пользователю во время установки, что расширение запрашивает определенные привилегии, и попросить его подтвердить, что они готовы предоставить эти привилегии. Браузер также может позволять пользователю проверять права расширения после установки. Поскольку запрос на предоставление привилегий может повлиять на желание пользователей установить ваше расширение, запрос привилегий заслуживает внимательного рассмотрения. Например, вы хотите избежать запроса ненужных разрешений и можете указать информацию о том, почему вы запрашиваете разрешения, в описании магазина расширения. Дополнительные сведения о проблемах, которые следует учитывать, см. В статье Запрос необходимых разрешений .

    Для получения информации о том, как тестировать и предварительно просматривать запросы разрешений, см. Тестовые запросы разрешений на сайте Extension Workshop.

    Ключ может содержать три вида разрешений:

    • разрешения хоста (только Manifest V2, разрешения хоста указаны в ключе манифеста host_permission для Manifest V3 или выше).
    • API permissions
    • activeTab разрешение

    Host permissions

    Примечание. При использовании Manifest V3 или более поздней версии разрешения хоста должны быть указаны в ключе манифеста host_permission .

    Разрешения хоста указываются как шаблоны соответствия , и каждый шаблон определяет группу URL-адресов, для которых расширение запрашивает дополнительные привилегии. Например, разрешение хоста может быть "*://developer.mozilla.org/*" .

    Дополнительные привилегии включают:

    • XMLHttpRequest и получение доступа к этим источникам без ограничений на разные источники (даже для запросов, сделанных из сценариев содержимого)
    • умение читать закладки конкретных метаданных без «закладок» разрешения, таких как url , title , и favIconUrl свойства tabs.Tab объектов
    • возможность программно внедрять скрипты (с помощью tabs.executeScript() ) в страницы, обслуживаемые из этих источников
    • возможность получать события от API webrequest для этих хостов
    • возможность доступа к файлам cookie для этого хоста с помощью API cookies , если также включено разрешение API "cookies" .
    • обход защиты от отслеживания для страниц расширения,где хост указан как полный домен или с подстановочными знаками.Однако скрипты содержимого могут обходить защиту от отслеживания только для хостов,указанных с полным доменом.

    В Firefox,начиная с версии 56,расширения автоматически получают разрешения хоста для своего собственного происхождения,которое имеет вид:

    moz-extension:
    

    где 60a20a9b-1ad4-af49-9b6c-c64c98c37920 — это внутренний идентификатор расширения. Расширение может получить этот URL программно, вызвав extension.getURL() :

    browser.extension.getURL("");
    // moz-extension://60a20a9b-1ad4-af49-9b6c-c64c98c37920/
    

    API permissions

    Разрешения API указываются в виде ключевых слов, и каждое ключевое слово обозначает API WebExtension, который расширение хотело бы использовать.

    В настоящее время доступны следующие ключевые слова:

    • activeTab
    • alarms
    • background
    • bookmarks
    • browserSettings
    • browsingData
    • captivePortal
    • clipboardRead
    • clipboardWrite
    • contentSettings
    • contextMenus
    • contextualIdentities
    • cookies
    • debugger
    • dns
    • downloads
    • downloads.open
    • find
    • geolocation
    • history
    • identity
    • idle
    • management
    • menus
    • menus.overrideContext
    • nativeMessaging
    • notifications
    • pageCapture
    • pkcs11
    • privacy
    • proxy
    • scripting
    • search
    • sessions
    • storage
    • tabHide
    • tabs
    • theme
    • topSites
    • unlimitedStorage
    • webNavigation
    • webRequest
    • webRequestBlocking

    В большинстве случаев разрешение просто предоставляет доступ к API,за следующими исключениями:

    • tabs дает вам доступ к privileged parts of the tabs API без необходимости разрешения хоста : Tab.url , Tab.title и Tab.faviconUrl .

      • В Firefox 85 и выше, вы также должны tabs , если вы хотите включить url в queryInfo параметра для tabs.query() . Остальные API tabs можно использовать без запроса разрешения.
      • Начиная с Firefox 86 и Chrome 50, соответствующие разрешения хоста также можно использовать вместо разрешения «вкладки».
    • webRequestBlocking позволяет использовать аргумент "blocking" , чтобы вы могли modify and cancel requests .
    • downloads.open позволяет использовать API downloads.open() .
    • tabHide позволяет использовать API tabs.hide() .

    activeTab permission

    Это разрешение указано как "activeTab" . Если расширение имеет разрешение activeTab , тогда, когда пользователь взаимодействует с расширением, расширению предоставляются дополнительные привилегии только для активной вкладки.

    «Взаимодействие с пользователем» включает:

    • пользователь нажимает на действие браузера или действие страницы расширения
    • пользователь выбирает пункт контекстного меню
    • пользователь активирует комбинацию клавиш,определенную расширением

    Дополнительными привилегиями являются:

    • Возможность программно вставлять JavaScript или CSS во вкладку с помощью browser.tabs.executeScript() и browser.tabs.insertCSS()
    • Доступ к привилегированным частям API вкладок для текущей вкладки: Tab.url , Tab.title и Tab.faviconUrl .

    Это разрешение предназначено для того,чтобы позволить расширениям выполнять общие задачи,не предоставляя им очень мощных разрешений.Многие расширения хотят «сделать что-то с текущей страницей,когда пользователь попросит».

    Например, рассмотрим расширение, которое хочет запустить сценарий на текущей странице, когда пользователь щелкает действие браузера. Если разрешение activeTab не существует, расширение должно будет запросить разрешение хоста <all_urls> . Но это дает расширению больше возможностей, чем ему нужно: теперь оно может выполнять сценарии на любой вкладке в любое время , когда ему нравится, а не только на активной вкладке и только в ответ на действие пользователя.

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

    Обычно вкладка, которой предоставлено activeTab , — это просто текущая активная вкладка, за исключением одного случая. menus API , дает расширение , чтобы создать пункт меню , который показан , если пользователь контекстно-нажимает на вкладке (то есть, на элементе в TabStrip , который позволяет пользователю переключаться с одной вкладки на другую).

    Если пользователь щелкает такой элемент, то разрешение activeTab предоставляется для вкладки, которую щелкнул пользователь, даже если это не текущая активная вкладка (в Firefox 63, ошибка 1446956 ).

    Clipboard access

    Unlimited storage

    Разрешение unlimitedStorage :

    • Позволяет расширениям превышать любую квоту, установленную API storage.local
    • В Firefox позволяет расширениям создавать «постоянную» базу данных IndexedDB без запроса браузера у пользователя во время создания базы данных.

    Example

     "permissions": ["*://developer.mozilla.org/*"]
    

    Только в Manifest V2 запрашивайте привилегированный доступ к страницам на странице developer.mozilla.org .

    Запросите доступ к привилегированным частям API tabs .

      "permissions": ["*://developer.mozilla.org/*", "tabs"]
    

    Только в Manifest V2 запросите оба вышеуказанных разрешения.

    Browser compatibility

    Desktop Mobile
    Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox для Android Opera Android Safari на IOS Samsung Internet
    permissions

    Yes

    14

    48

    ?

    Yes

    14

    ?

    ?

    48

    ?

    15

    ?

    activeTab

    Yes

    79

    48

    ?

    Yes

    14

    ?

    ?

    48

    ?

    15

    ?

    alarms

    Yes

    79

    48

    ?

    Yes

    14

    ?

    ?

    48

    ?

    15

    ?

    background

    10

    79

    No

    ?

    No

    No

    ?

    ?

    No

    ?

    No

    ?

    bookmarks

    Yes

    15

    48

    ?

    Yes

    No

    ?

    ?

    No

    ?

    No

    ?

    browserSettings

    No

    No

    56

    ?

    No

    No

    ?

    ?

    56

    ?

    No

    ?

    browsingData

    Yes

    79

    53

    ?

    Yes

    No

    ?

    ?

    85

    56-79

    ?

    No

    ?

    captivePortal

    No

    No

    68

    ?

    No

    No

    ?

    ?

    No

    ?

    No

    ?

    clipboardRead

    Yes

    79

    54

    ?

    Yes

    No

    ?

    ?

    54

    ?

    No

    ?

    clipboardWrite

    Yes

    79

    51

    ?

    Yes

    14

    ?

    ?

    51

    ?

    15

    ?

    contentSettings

    Yes

    79

    No

    ?

    Yes

    No

    ?

    ?

    No

    ?

    No

    ?

    contextMenus

    Yes

    14

    55

    Доступно как псевдоним для разрешения menus .

    ?

    Yes

    14

    Доступно как псевдоним для разрешения menus .

    ?

    ?

    No

    ?

    No

    ?

    contextualIdentities

    No

    No

    53

    ?

    No

    No

    ?

    ?

    53

    ?

    No

    ?

    cookies

    Yes

    14

    48

    ?

    Yes

    14

    ?

    ?

    48

    ?

    15

    ?

    debugger

    Yes

    79

    No

    ?

    Yes

    No

    ?

    ?

    No

    ?

    No

    ?

    dns

    No

    No

    60

    ?

    No

    No

    ?

    ?

    60

    ?

    No

    ?

    downloads

    Yes

    79

    48

    ?

    Yes

    No

    ?

    ?

    48

    ?

    No

    ?

    downloads_open

    Yes

    79

    48

    ?

    Yes

    No

    ?

    ?

    48

    ?

    No

    ?

    find

    No

    No

    57

    ?

    No

    No

    ?

    ?

    No

    ?

    No

    ?

    geolocation

    Yes

    14

    54

    ?

    Yes

    No

    ?

    ?

    54

    ?

    No

    ?

    history

    Yes

    79

    49

    ?

    Yes

    No

    ?

    ?

    No

    ?

    No

    ?

    identity

    Yes

    79

    53

    ?

    Yes

    No

    ?

    ?

    No

    ?

    No

    ?

    idle

    Yes

    15

    48

    ?

    Yes

    No

    ?

    ?

    48

    ?

    No

    ?

    management

    Yes

    79

    51

    ?

    Yes

    No

    ?

    ?

    51

    ?

    No

    ?

    menus

    No

    No

    53

    ?

    No

    14

    ?

    ?

    No

    ?

    No

    ?

    nativeMessaging

    29

    15

    50

    ?

    16

    14

    ?

    ?

    No

    ?

    15

    ?

    notifications

    5

    79

    48

    ?

    25

    No

    ?

    ?

    48

    ?

    No

    ?

    pageCapture

    Yes

    79

    No

    ?

    Yes

    No

    ?

    ?

    No

    ?

    No

    ?

    pkcs11

    No

    No

    58

    ?

    No

    No

    ?

    ?

    No

    ?

    No

    ?

    privacy

    Yes

    79

    54

    ?

    Yes

    No

    ?

    ?

    54

    ?

    No

    ?

    proxy

    33

    79

    55

    ?

    No

    No

    ?

    ?

    55

    ?

    No

    ?

    search

    No

    No

    63

    ?

    No

    No

    ?

    ?

    No

    ?

    No

    ?

    sessions

    Yes

    79

    52

    ?

    Yes

    No

    ?

    ?

    No

    ?

    No

    ?

    storage

    Yes

    14

    48

    ?

    Yes

    14

    ?

    ?

    48

    ?

    15

    ?

    tabHide

    No

    No

    61

    ?

    No

    No

    ?

    ?

    No

    ?

    No

    ?

    tabs

    Yes

    14

    48

    ?

    Yes

    14

    ?

    ?

    54

    ?

    15

    ?

    theme

    No

    No

    55

    ?

    No

    No

    ?

    ?

    No

    ?

    No

    ?

    topSites

    Yes

    79

    52

    ?

    Yes

    No

    ?

    ?

    52

    ?

    No

    ?

    unlimitedStorage

    Yes

    14

    56

    ?

    No

    16

    Начиная с Safari 16 квота хранилища не ограничена.

    14

    Не предоставляет неограниченную квоту хранения.Предоставляет квоту на хранение 10 МБ вместо стандартных 5 МБ.

    ?

    ?

    56

    ?

    16

    Начиная с Safari 16 квота хранилища не ограничена.

    15

    Не предоставляет неограниченную квоту хранения.Предоставляет квоту на хранение 10 МБ вместо стандартных 5 МБ.

    ?

    webNavigation

    Yes

    14

    48

    ?

    17

    14

    ?

    ?

    48

    ?

    15

    ?

    webRequest

    Yes

    14

    48

    ?

    Yes

    14

    ?

    ?

    48

    ?

    No

    ?

    webRequestBlocking

    Yes

    14

    48

    ?

    Yes

    No

    ?

    ?

    48

    ?

    No

    ?



    Web Extensions

    options_ui
    page_action
    protocol_handlers
    short_name

    Как исправить ошибку приложения: возникло исключение на стороне клиента (см. консоль браузера для получения более подробной информации)

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

    Понимание возникшей ошибки

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

    Исправление ошибки

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

    1. Проверьте входные данные: Убедитесь, что входные данные, передаваемые в приложение, являются корректными и в ожидаемом формате. Неправильные или некорректные данные могут вызвать ошибки на стороне клиента.

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

    3. Отслеживайте и обрабатывайте исключения: Используйте механизмы обработки исключений в вашем коде для предотвращения падений приложения и вывода полезной информации о возникшей ошибке.

    4. Обновите или переустановите зависимости: Убедитесь, что все используемые в приложении библиотеки или пакеты обновлены до последних версий. Устаревшие или несовместимые зависимости могут вызывать ошибки на стороне клиента.

    5. Разберитесь с сетевыми проблемами: Проверьте соединение с сервером, чтобы убедиться, что нет проблем с сетью. Некорректные ответы сервера или обрывы соединения могут вызывать ошибки на стороне клиента.

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

    Заключение

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

    Время на прочтение
    5 мин

    Количество просмотров 15K

    Если вы сталкивались с CORS, то знаете всю ту боль, которую испытывает разработчик, когда нужно сходить к API на другом домене. Если конфигурация сервера не доступна для настройки, то использовали какое-нибудь решение на основе не менее популярного решения cors-anywhere.

    Пятница вечер делать нечего

    Не многим изестно, что директива proxy_pass поддерживает не только локальные домены и потоки (aka upstream), но и внешние источники, например:

    proxy_pass https://api.github.com/$request_uri

    Так зародилась идея написать универсальный (с некоторыми оговорками) конфиг для nginx, который поддерживает любой переданный домен.

    Чем мы можем управлять

    Мы можем объявлять новые переменные на основе глобальных c поддержой регулярных выражений с помощью map:

    map $request_url $my_request_path {
      ~*/(.*)$ $1;
      default  "";
    }

    Так, при запросе к http://example.com/api в переменной $my_request_path будет лежать api.

    Мы можем отправлять клиенту дополнительные заголовки с помощью add_header:

    add_header X-Request-Path $my_request_path always;

    Теперь у нас добавился заголовок X-Request-Path с значением api.

    С помощью директивы proxy_set_header добавлять заголовки к запросу, который отправляется proxy_pass. А с помощью proxy_hide_header скрывать заголовки, которые мы получили от proxy_pass.

    С помощью директивы if обрабатывать выражения, например, при запросе методом OPTIONS отдавать сразу нужный код ответа:

    if ($request_method = OPTIONS) {
      return 204;
    }

    Собираем все вместе

    Для начала объявим $proxy_uri который мы будем извлекать из $request_uri:

    map $request_uri $proxy_uri {
      ~*/http://(.*)/(.+)$  "http://$1/$2";
      ~*/https://(.*)/(.+)$ "https://$1/$2";
      ~*/http://(.*)$       "http://$1/";
      ~*/https://(.*)$      "https://$1/";
      ~*/(.*)/(.+)$         "https://$1/$2";
      ~*/(.*)$              "https://$1/";
      default               "";
    }

    Если коротко это работает так: при запросе http://example.com/example.ru, в переменной $proxy_uri будет лежать https://example.ru

    Из полученного $proxy_uri извлечем часть, которая будет соответствовать заголовку Origin:

    map $proxy_uri $proxy_origin {
      ~*(.*)/.*$ $1;
      default    "";
    }

    Для заголовка Forwarded нам понадобится обработать сразу 2 переменные:

    map $remote_addr $proxy_forwarded_addr {
      ~^[0-9.]+$        "for=$remote_addr";
      ~^[0-9A-Fa-f:.]+$ "for=\"[$remote_addr]\"";
      default           "for=unknown";
    }
    
    map $http_forwarded $proxy_add_forwarded {
      ""      "$proxy_forwarded_addr";
      default "$http_forwarded, $proxy_forwarded_addr";
    }

    Обработка заголовока X-Forwarded-For уже встроена в nginx

    Теперь мы можем перейти к объявлению нашего проксирующего сервера:

    server {
      listen 443 ssl; 
      
      server_name cors.example.com;
      
      proxy_http_version         1.1;
      proxy_pass_request_headers on;
      proxy_pass_request_body    on;
      
      proxy_redirect             off;
      resolver                   77.88.8.8 77.88.8.1 8.8.8.8 8.8.4.4 valid=1d;
      
      location / {
        if ($proxy_uri = "") {
          # empty uri
          return 403;
        }
        
        # add proxy cors headers
        add_header Access-Control-Allow-Headers "*" always;
        add_header Access-Control-Allow-Methods "*" always;
        add_header Access-Control-Allow-Origin  "*" always;
    
        if ($request_method = OPTIONS) {
          return 204;
        }
        
        proxy_set_header Host                $proxy_host;
        proxy_set_header Origin              $proxy_origin;
        proxy_set_header X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto   $scheme;
        proxy_set_header Forwarded           "$proxy_add_forwarded;proto=$scheme";
        
        proxy_pass $proxy_uri;
      }
    }

    Мы получили минимально рабочий проксирующий сервер, у которого обрабатывается CORS Preflight Request и добавляются соответствующие заголовки.

    Делаем красиво

    Все бы хорошо, но если у сервера, к которому мы проксируем, будет настроена обработка CORS, то его заголовки будут передаваться клиенту. Давайте скроем все возможные:

    # hide original cors
    proxy_hide_header Access-Control-Allow-Credentials;
    proxy_hide_header Access-Control-Allow-Headers;
    proxy_hide_header Access-Control-Allow-Methods;
    proxy_hide_header Access-Control-Allow-Origin;
    proxy_hide_header Access-Control-Expose-Headers;
    proxy_hide_header Access-Control-Max-Age;
    proxy_hide_header Access-Control-Request-Headers;
    proxy_hide_header Access-Control-Request-Method;

    Хорошо бы еще передавать IP клиента, чтобы хоть как-то обходить rate limit, который может возникнуть, если несколько пользователей будут обращаться к одному ресурсу:

    proxy_set_header X-Real-IP           $remote_addr;
    proxy_set_header X-Client-IP         $remote_addr;
    proxy_set_header CF-Connecting-IP    $remote_addr;
    proxy_set_header Fastly-Client-IP    $remote_addr;
    proxy_set_header True-Client-IP      $remote_addr;
    proxy_set_header X-Cluster-Client-IP $remote_addr;

    Мы же не говорим про анонимность, верно?)

    И, напоследок, немного улучшим производительность выключив кэш/буферизацию/etc:

    sendfile                   on;
    tcp_nodelay                on;
    tcp_nopush                 on;
    
    etag                       off;
    if_modified_since          off;
    
    proxy_buffering            off;
    proxy_cache                off;
    proxy_cache_convert_head   off;
    proxy_max_temp_file_size   0;
    client_max_body_size       0;
    
    proxy_read_timeout         1m;
    proxy_connect_timeout      1m;
    reset_timedout_connection  on;
    
    gzip                       off;
    gzip_proxied               off;
    # brotli                   off;

    Конфиг полностью

    map $request_uri $proxy_uri {
      ~*/http://(.*)/(.+)$  "http://$1/$2";
      ~*/https://(.*)/(.+)$ "https://$1/$2";
      ~*/http://(.*)$       "http://$1/";
      ~*/https://(.*)$      "https://$1/";
      ~*/(.*)/(.+)$         "https://$1/$2";
      ~*/(.*)$              "https://$1/";
      default               "";
    }
    
    map $proxy_uri $proxy_origin {
      ~*(.*)/.*$ $1;
      default    "";
    }
    
    map $remote_addr $proxy_forwarded_addr {
      ~^[0-9.]+$        "for=$remote_addr";
      ~^[0-9A-Fa-f:.]+$ "for=\"[$remote_addr]\"";
      default           "for=unknown";
    }
    
    map $http_forwarded $proxy_add_forwarded {
      ""      "$proxy_forwarded_addr";
      default "$http_forwarded, $proxy_forwarded_addr";
    }
    
    server {
      listen 443 ssl;
      
      ssl_certificate /etc/letsencrypt/live/cors.example.com/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/cors.example.com/privkey.pem;
      ssl_trusted_certificate /etc/letsencrypt/live/cors.example.com/chain.pem;
      
      server_name cors.example.com;
      
      sendfile                   on;
      tcp_nodelay                on;
      tcp_nopush                 on;
      
      etag                       off;
      if_modified_since          off;
      
      proxy_buffering            off;
      proxy_cache                off;
      proxy_cache_convert_head   off;
      proxy_max_temp_file_size   0;
      client_max_body_size       0;
      
      proxy_http_version         1.1;
      proxy_pass_request_headers on;
      proxy_pass_request_body    on;
      
      proxy_read_timeout         1m;
      proxy_connect_timeout      1m;
      reset_timedout_connection  on;
      
      proxy_redirect             off;
      resolver                   77.88.8.8 77.88.8.1 8.8.8.8 8.8.4.4 valid=1d;
      
      gzip                       off;
      gzip_proxied               off;
      # brotli                   off;
      
      location / {
        if ($proxy_uri = "") {
          return 403;
        }
        
        # add proxy cors
        add_header Access-Control-Allow-Headers "*" always;
        add_header Access-Control-Allow-Methods "*" always;
        add_header Access-Control-Allow-Origin  "*" always;
    
        if ($request_method = "OPTIONS") {
          return 204;
        }
        
        # pass client to proxy
        proxy_set_header Host                $proxy_host;
        proxy_set_header Origin              $proxy_origin;
        proxy_set_header X-Real-IP           $remote_addr;
        proxy_set_header X-Client-IP         $remote_addr;
        proxy_set_header CF-Connecting-IP    $remote_addr;
        proxy_set_header Fastly-Client-IP    $remote_addr;
        proxy_set_header True-Client-IP      $remote_addr;
        proxy_set_header X-Cluster-Client-IP $remote_addr;
        proxy_set_header X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto   $scheme;
        proxy_set_header Forwarded           "$proxy_add_forwarded;proto=$scheme";
        
        # hide original cors
        proxy_hide_header Access-Control-Allow-Credentials;
        proxy_hide_header Access-Control-Allow-Headers;
        proxy_hide_header Access-Control-Allow-Methods;
        proxy_hide_header Access-Control-Allow-Origin;
        proxy_hide_header Access-Control-Expose-Headers;
        proxy_hide_header Access-Control-Max-Age;
        proxy_hide_header Access-Control-Request-Headers;
        proxy_hide_header Access-Control-Request-Method;
        
        proxy_pass $proxy_uri;
      }
    }

    giga

    giga

    Well-Known Member


    FabioRome


    • #3

    console: ping google.com (no www)
    «host not found»

    giga

    giga

    Well-Known Member


    • #4

    This sounds like the problem.
    result should be: google.com should resolve to an IP
    Pinging google.com [216.58.218.206] with 32 bytes of data:
    Reply from 216.58.218.206: bytes=32 time=27ms TTL=53
    Reply from 216.58.218.206: bytes=32 time=25ms TTL=53
    Reply from 216.58.218.206: bytes=32 time=25ms TTL=53
    Reply from 216.58.218.206: bytes=32 time=30ms TTL=53

    If you are using an IP try to ping it and see if it works.

    FabioRome


    • #5

    sorry for my english.

    PC always uses a proxy so if I do I always get a PING «host not found» but if I go to use the internet browser.

    I would be enough to also use the proxy system default but I have the same problem:

    SetSystemProperty("java.net.useSystemProxies", "True")

    with programs written in object-pascal I have no problems with the proxy

    Thank you

    FabioRome


    • #6

    UPDATE

    java -Dhttp.proxyHost=proxy_ip -Dhttp.proxyPassword=proxy_pwd -Dhttp.proxyPort=8080 -Dhttp.proxyUserName=proxy_user  my_file_name.jar

    or

    java -jar -Djava.net.useSystemProxies=true my_file_name.jar

    same mistake

    Erel


    • #7

    Can you post the code that raises this exception?

    FabioRome


    • #8

    Private Sub leggi_file_impostazioni_proxy (myProxy As Boolean)
    
       If myProxy = False Then
         SetSystemProperty("http.proxyHost", "" )
         SetSystemProperty("http.proxyPort", "" )
         SetSystemProperty("http.proxyUser", "" )
         SetSystemProperty("http.proxyPassword", "" )
    
       Else
         SetSystemProperty("http.proxyHost", "proxy_name" )
         SetSystemProperty("http.proxyPort", "8080" )
         SetSystemProperty("http.proxyUser", "my_username" )
         SetSystemProperty("http.proxyPassword", "my_password" )
       End If
      
    End Sub

    Erel


    • #9

    This code by itself will not cause any error. Where is the code that makes the network call?

    FabioRome


    • #10

    hi Erel,
    in attachment you have my example complete.
    the file INI is blank:

    [PROXY]
    ProxyHost=xxxx
    ProxyPort=8080
    ProxySchema=http
    ProxyUsername=xxxx
    ProxyPassword=xxxx
    
    [DATABASE]
    DatabaseHost=localhost
    DatabaseName=xxxxx
    DatabaseUsername=xxxx
    DatabasePassword=xxxx

    you have also php file ponte_stetreCHuf_sTeb44ruC-copia.php

    Thank you very much
    Regards
    Fabio

    Last edited:

    Erel


    • #11

    Use HttpUtils2 source code and modify HttpUtils2Service. Set the proxy with hc.SetProxy (or hc.SetProxy2).

    FabioRome


    FabioRome


    • #13

    modify HttpUtils2Service.bas

    Public Sub SubmitJob(job As HttpJob) As Int
        '** Modifica
        If Main.ProxyHost <> Null AND Main.ProxyPort <> 0 Then
            If Main.ProxyUsername <> Null AND Main.ProxyPassword <> Null Then
                hc.SetProxy2(Main.ProxyHost, Main.ProxyPort, Main.ProxyScheme, Main.ProxyUsername, Main.ProxyPassword)
            Else
                hc.SetProxy(Main.ProxyHost, Main.ProxyPort, Main.ProxyScheme)
            End If
        End If
        '** Fine Modifica
       
        taskCounter = taskCounter + 1
        TaskIdToJob.Put(taskCounter, job)
        If job.Username <> "" AND job.Password <> "" Then
            hc.ExecuteCredentials(job.GetRequest, taskCounter, job.Username, job.Password)
        Else
            hc.Execute(job.GetRequest, taskCounter)
        End If
        Return taskCounter
    End Sub

    FabioRome


    • #14

    Use HttpUtils2 source code and modify HttpUtils2Service. Set the proxy with hc.SetProxy (or hc.SetProxy2).

    Hi @Erel ,
    i replaced JHttpUtils2 with JOKHttpUtils and JHttp with JOKHttp.
    how can I put the proxy in Jokhttp ?

    Thank you

    Erel


    • #15

    You can use this code to set a proxy with OkHttp:

    Sub SetProxy (hc As OkHttpClient, Host As String, Port As Int)
       Dim jo As JavaObject = hc
       Dim proxy, socketAddress As JavaObject
       socketAddress.InitializeNewInstance("java.net.InetSocketAddress", Array (Host, Port))
       proxy.InitializeNewInstance("java.net.Proxy", Array ("HTTP", socketAddress))
       jo.GetFieldJO("client").RunMethod("setProxy", Array(proxy))
    End Sub

    FabioRome


    • #16

    You can use this code to set a proxy with OkHttp:

    Sub SetProxy (hc As OkHttpClient, Host As String, Port As Int)
       Dim jo As JavaObject = hc
       Dim proxy, socketAddress As JavaObject
       socketAddress.InitializeNewInstance("java.net.InetSocketAddress", Array (Host, Port))
       proxy.InitializeNewInstance("java.net.Proxy", Array ("HTTP", socketAddress))
       jo.GetFieldJO("client").RunMethod("setProxy", Array(proxy))
    End Sub

    thank you Erel, and for setting also username e password? thank you so much

    Erel


    • #17

    It is currently not possible to set username and password for the proxy.

    FabioRome


    • #18

    It is currently not possible to set username and password for the proxy.

    thanks anyway

    jmon

    jmon

    Well-Known Member


    • #19

    I know it’s an old thread, but this wasn’t solved properly it seems.

    It’s missing the «https» proxy:

    SetSystemProperty("http.proxyHost", ProxyHost )
    SetSystemProperty("https.proxyHost", ProxyHost )
    SetSystemProperty("http.proxyPort", ProxyPort )
    SetSystemProperty("https.proxyPort", ProxyPort )

    That works for me, both for Webview and HttpJobs.

    [edit] I guess it’s the same for the userName and password

    Last edited:

    Понравилась статья? Поделить с друзьями:

    Интересное по теме:

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

  • Добавить комментарий

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: