锚标记上的 JQuery click() 不是从 WebBrowser 控件中注入的脚本触发的



我正在使用WinForms WebBrowser控件开发一个Web机器人。除了以下代码中的第二个click()调用外,一切正常:

function SaveRecordClick() {
try {
var menuButton = $('#s_at_m_4');
menuButton.click();             //<-- This is working
var x = $('#s_at_m_4-menu li')[5];
var saveLink = $(x).find('a')[0];
if (saveLink != null){
saveLink.click();           //<-- This is not working
return "1";
}
}
catch (err) {
alert(err.message);
}
return "0";
}

saveLink不为空。我知道这一点,因为我在条件内拨打了alert()电话。

使用建议的解决方案更新了代码

function SaveRecordClick() {
try {
var menuButton = $('#s_at_m_4');
menuButton.click();
var x = $('#s_at_m_4-menu li').eq(5);
var saveLink = x.find('a').eq(0);
if (saveLink != null) {
alert(saveLink.html());
saveLink.click();
return "1";
}
}
catch (err) {
alert(err.message);
}
return "0";
}

但仍然是同样的问题。"alert()"工作正常,但html()显示内部文本而不是锚点的 HTML。

网页代码

<li data-caption="Save Record                [Ctrl+S]" class="sbui-appletmenu-item  ui-menu-item" role="presentation">
<a href="javascript:void(0)" aria-disabled="false" class="ui-corner-all" id="ui-id-254" tabindex="-1" role="menuitem">Save Record                [Ctrl+S]</a>
</li>

锚标记ID是动态生成的。

此外,当从谷歌浏览器控制台执行相同的代码时,click()会触发。那么,这可能是Web浏览器控件的问题吗?

更新

我认为伙计们,这是继承Internet Explorer的webrowser控件的问题。所以现在我正在转移到另一个浏览器控件并测试其上的代码。会让你知道它是否在那里工作。

你必须用jQuery包装你的对象才能让它工作:

var saveLink = $($(x).find('a')[0]);

尝试使用以下条件:

  1. trigger('click')而不是click
  2. 使用if(saveLink)更改 if 条件验证。它验证了所有虚假陈述null,undefined
  3. 返回时number=> 0而不是sting =>'0'
  4. anchor标记重定向与window.location.href一起使用,并从锚点获取href值,请尝试使用attr('href')
function SaveRecordClick() {
try {
var menuButton = $('#s_at_m_4');
menuButton.trigger('click');
var x = $('#s_at_m_4-menu li').eq(5);
var saveLink = x.find('a').eq(0);
if (saveLink) {
alert(saveLink.html());
window.location.href=saveLink.attr('href');
return 1;
}
} catch (err) {
alert(err.message);
}
return 0;
}

工作示例

function SaveRecordClick() {
try {
var menuButton = $('#s_at_m_4');
menuButton.trigger('click');
var x = $('#s_at_m_4-menu li').eq(5);
var saveLink = x.find('a').eq(0);
if (saveLink) {
alert(saveLink.html());
window.location.href=saveLink.attr('href');
return 1;
}
} catch (err) {
alert(err.message);
}
return 0;
}
SaveRecordClick()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="s_at_m_4-menu">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li data-caption="Save Record                [Ctrl+S]" class="sbui-appletmenu-item  ui-menu-item" role="presentation">
<a href="https://example.com" aria-disabled="false" onclick="console.log('s')" class="ui-corner-all" id="ui-id-254" tabindex="-1" role="menuitem">Save Record                [Ctrl+S]</a>
</li>
<li></li>
</ul>

saveLink永远不会被null,因为find/eq将始终返回一个jQuery对象,无论元素是否存在。

相反,请尝试使用length属性来检查是否存在:

if (saveLink.length)
function SaveRecordClick() {
try {
var menuButton = $('#s_at_m_4');
menuButton.click();
var x = $('#s_at_m_4-menu li').eq(5);
var saveLink = x.find('a').eq(0);
if (saveLink != null) {
alert(saveLink.html());
saveLink.live('click');//Use live click 
return "1";
}
}
catch (err) {
alert(err.message);
}
return "0";
}

savelink 应该是 dom 元素以进行空检查

var saveLink = $(x).find('a:first')[0];

var saveLink = $(x).find('a').eq(0)[0];

var saveLink = $(x).find('a').first()[0];

我不明白 您需要在点击中单击或添加功能吗?

添加功能:

jQuery('teste').click(function(){console.log('teste')});

点击:

jQuery('teste').trigger('click');

Teste利用了jQuery。

jQuery(saveLink).click(function(){
console.log('click!');
});

试试这个

$(document).on('click',$(saveLink),function(event){ ///your code })

从 JavaScript 触发事件的最佳方式

$( "#ID" ).trigger( "click" ); 

我希望它能为你工作。

使用建议的解决方案更新的代码很好,但.html()方法获取 HTML 元素的内容。因此,您需要使用saveLink.parent().html()来获取锚点的外部 HTML。
如果父容器中还有其他元素,您可以创建临时元素以仅获取 hiperlink HTML:

var anchorHTML = $('<div>').append(saveLink.clone()).html();

要使用Javascript单击saveLink,请尝试使用x.find('a')[0].click()而不是saveLink.click()
为了视觉清晰起见,我在href属性中使用了您的个人资料的 URL。如果您运行下面的代码片段,则将模拟用户单击链接并显示您的个人资料页面。

function SaveRecordClick() {
try {
var x = $('#s_at_m_4-menu li').eq(5);
var saveLink = x.find('a').eq(0);
if (saveLink != null) {
var anchorHTML = $('<div>').append(saveLink.clone()).html();
alert(anchorHTML);
saveLink[0].click();
return "1";
}
} catch (err) {
alert(err.message);
}
return "0";
}
console.log(SaveRecordClick());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="s_at_m_4-menu">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li data-caption="Save Record                [Ctrl+S]" class="sbui-appletmenu-item  ui-menu-item" role="presentation">
<a href="https://stackoverflow.com/users/1124494/aishwarya-shiva" aria-disabled="false" class="ui-corner-all" id="ui-id-254" tabindex="-1" role="menuitem">Save Record                [Ctrl+S]</a>
</li>
<li></li>
</ul>

记住一件事 javascript 和 javascript 框架是事件驱动的,所以请不要尝试实现函数式编程概念

$(document).ready(function(){
$("#s_at_m_4").click(function(){
// put your code here   
});
});

我对此的理论是,单击函数实际上并未绑定到元素。这可能是由于执行单击的脚本或绑定时 html 尚未在页面中。尝试检查 saveLink.click() 中的绑定单击;

尝试以格式制作

$(body).delegate(saveLink, 'click', function() { //try alert here to check });

谢谢大家的回答和评论。

在花了一周时间研究第三方网站后,今天我终于找到了解决问题的方法。实际上,问题不在于JavaScript或HTML,而在于网站验证我尝试使用机器人自动填充的表单的方式。

我悬赏了评论中的对话给了我一些提示的答案。

点击saveLink没有触发,因为我使用.val()以编程方式设置文本框的值,但由于某种原因,网站没有保存直接使用此函数设置的值。但是当我使用从服务器加载文本框值的组合框更改值时(尽管从服务器或使用val()函数设置的值完全相同),然后单击成功触发。

我还在不同的地方使用了setTimeout(),因为在某些表单字段中设置值之前,代码执行得太快了。

因此,将来如果有人遇到类似的问题,请确保您研究您尝试提交的页面或表单的行为。

最新更新