我正在使用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]);
尝试使用以下条件:
trigger('click')
而不是click
- 使用
if(saveLink)
更改 if 条件验证。它验证了所有虚假陈述null,undefined
- 返回时
number=> 0
而不是sting =>'0'
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()
,因为在某些表单字段中设置值之前,代码执行得太快了。
因此,将来如果有人遇到类似的问题,请确保您研究您尝试提交的页面或表单的行为。