我试图覆盖第三方网页中的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#覆盖功能或采用其他工具/解决方法的解决方案,那将是非常好的。 预先感谢。
答案 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)