使用Selenium C#覆盖第三方网页中的JS

时间:2019-05-14 20:42:01

标签: javascript c# selenium

我试图覆盖第三方网页中的JS函数,目的是使用Selenium + ChromeDriver进行Web抓取。

为什么要经历所有这些麻烦,您可能会问。 在某些时候,当我尝试单击“提交表单”按钮时,JS函数中就有此调用:

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

这只是用户的确认弹出窗口。事实是,Chrome / Firefox / Edge不再支持showModalDialog,仅IE支持。我可以使用IE取得结果吗?不会,因为IE 11的IEDriver配置需要比我所能获得的更高的“安全权限等级”(又称管理员权限)。

最好的解决方案是将上面的代码替换为:

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没经验。

我可以使用Chrome手动覆盖abreAviso()函数。

如果你们中的一个能为我提供一个有关如何使用Selenium和C#覆盖功能或采用其他工具/解决方法的解决方案,那将是非常好的。 预先感谢。

1 个答案:

答案 0 :(得分:0)

这是使用Selenium js执行程序覆盖fs函数的方法。 (在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)

输出: screenshot of that code