Переопределить JS на сторонней веб-странице, используя Selenium C # - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь переопределить функцию JS на сторонней веб-странице с целью WebScraping с использованием Selenium + ChromeDriver.

Зачем проходить через все эти неприятности, спросите вы? В какой-то момент происходит такой вызов внутри функции JS, когда я пытаюсь нажать на кнопку «отправить форму»:

xxxx = window.showModalDialog("...");

Это просто всплывающее окно подтверждения для пользователя. Дело в том, что showModalDialog больше не поддерживается Chrome / Firefox / Edge, только IE. Могу ли я использовать IE для достижения результатов? Нет, поскольку конфигурации IEDriver для IE 11 требуется более высокий «уровень очистки» (он же привилегии администратора), чем я могу получить.

Лучшим решением было бы просто заменить приведенный выше код на:

xxxx = true;

Кнопка отправки HTML:

<button type="button" id="botaoFlatConfirmar" 
onclick="if (critica("some test") 
{ return Submeter('E', this, 'XXXXXXXXXX');; }" barrabotao="true" style="white-space: nowrap; ....</button>

и внутри Submeter () есть этот кусок кода:

if (abreAviso("xxxx")){ form.submit();}

Который возвращает нас к abreAviso ():

function abreAviso(msg, tipoMensagem, tituloTexto1, conteudoTexto1, tituloTexto2, conteudoTexto2, tituloTexto3, conteudoTexto3, altura, largura)
{   
    var retorno = false;
    if (altura == null) altura = 200
    if (largura == null) largura = 400
    if (tipoMensagem==null) tipoMensagem = 'I'

    if (tituloTexto1==null) tituloTexto1 = ''
    if (conteudoTexto1==null) conteudoTexto1=''
    if (tituloTexto2==null) tituloTexto2=''
    if (conteudoTexto2==null) conteudoTexto2=''
    if (tituloTexto3==null) tituloTexto3=''
    if (conteudoTexto3==null) conteudoTexto3=''
    retorno = window.showModalDialog("/XXXXXXXXXXXXX =" + msg + "&tipoMensagem=" + tipoMensagem + "&conteudoTexto1=" + conteudoTexto1 + "&conteudoTexto2=" + conteudoTexto2 + "&conteudoTexto3=" + conteudoTexto3 + "&tituloTexto1=" + tituloTexto1 + "&tituloTexto2=" + tituloTexto2 + "&tituloTexto3=" + tituloTexto3,"avisoPadrao","center:yes;dialogWidth:" + largura + "px;dialogheight=" + altura + "px;status=no;");
    return retorno; 
} 

Могу ли я принудительно отправить форму? Нет, потому что мне нужен код проверки данных внутри Submeter () (длиной более 2000 строк);

Итак, в идеале я бы хотел переопределить abreAviso (), если это возможно.

Я прочитал много тем по StackOverflow, но не смог придумать рабочий код.

Я попытался реализовать что-то с помощью JavaScriptExecutor и не смог, потому что мне нужно запустить его после функции Submeter ().

Важная информация:

Я действительно неопытен, когда дело доходит до JS.

Я могу переопределить функцию abreAviso () вручную с помощью Chrome.

Было бы очень хорошо, если бы один из вас, ребята, мог указать мне на решение о том, как переопределить функцию, используя Selenium и C #, или предложить какой-нибудь другой инструмент / метод решения. Заранее спасибо.

1 Ответ

0 голосов
/ 15 мая 2019

Вот способ переопределить функцию fs, используя selenium js executor.(проверил решение в python и преобразовал в C #)

IWebDriver driver; //may be assigned somewhere before this line.
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("window.abreAviso=function(){return true};");

// you check the output by executing this function
string fReturnVal = (string)js.ExecuteScript("return abreAviso()")
// print the fReturnVal (this will be True)

Вывод: enter image description here

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