我正在使用WinForms WebBrowser控件开发Web bot。除了以下代码中的第二个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";
}
但仍然是同样的问题。 &#39;警报()&#39;工作正常但html()
显示内部文本而不是锚的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
锚标签是动态生成的。
此外,从Google Chrome控制台执行相同代码时会触发click()
。那么,它可能是WebBrowser控件的问题吗?
更新
我认为这是继承Internet Explorer的webrowser控件的问题。所以现在我转移到另一个浏览器控件并测试它上面的代码。会告诉你它是否在那里工作。
答案 0 :(得分:1)
你必须使用jQuery包装你的对象才能使它工作:
var saveLink = $($(x).find('a')[0]);
答案 1 :(得分:1)
使用以下条件尝试:
trigger('click')
代替click
- 使用
if(saveLink)
更改if条件验证。验证null,undefined
所有虚假陈述- 使用
返回number=> 0
代替sting =>'0'
- 从锚点获取
anchor
标记重定向与window.location.href
一起使用,并通过attr('href')
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()
&#13;
<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>
&#13;
答案 2 :(得分:0)
saveLink
永远不会是null
,因为find
/ eq
将始终返回一个jQuery对象,无论该元素是否存在。
相反,请尝试使用length
属性检查是否存在:
if (saveLink.length)
答案 3 :(得分:0)
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";
}
答案 4 :(得分: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];
答案 5 :(得分:0)
我不明白 您是否需要在点击中单击或添加功能?
添加功能:
jQuery('teste').click(function(){console.log('teste')});
点击:
jQuery('teste').trigger('click');
答案 6 :(得分:0)
Teste使用了jQuery。
jQuery(saveLink).click(function(){
console.log('click!');
});
答案 7 :(得分:0)
试试这个
$(document).on('click',$(saveLink),function(event){
///your code
})
答案 8 :(得分:0)
您使用建议解决方案的更新代码很好,但.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
属性中使用了您个人资料的网址。如果您运行下面的代码段,则会模拟用户点击链接,并显示您的个人资料页面。
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>
答案 9 :(得分:0)
从JavaScript激活事件的最佳方式
$( "#ID" ).trigger( "click" );
我希望它对你有用。
答案 10 :(得分:0)
记住一件事javascript和javascript框架是事件驱动的,所以请不要尝试实现函数式编程概念
$(document).ready(function(){
$("#s_at_m_4").click(function(){
// put your code here
});
});
答案 11 :(得分:0)
我的理论是,click函数实际上并没与元素绑定。这可能是由于执行click脚本或绑定时页面中还没有html。尝试检查saveLink.click();
中的绑定点击尝试以
格式制作 $(body).delegate(saveLink, 'click', function() {
//try alert here to check
});
答案 12 :(得分:0)
感谢大家的回答和评论。
在研究第三方网站一周后,今天我终于找到了解决问题的方法。实际上问题不是JavaScript或HTML,而是网站验证表单的方式我试图使用我的机器人自动填充。
我给了答案赏金,他在评论中的对话给了我一些提示。
saveLink
上的点击未触发,因为我是使用.val()
以编程方式设置文本框的值,但由于某种原因,网站未保存使用此功能直接设置的值。但是当我使用组合框更改值时,该组合框从服务器加载文本框的值(尽管从服务器或使用val()
函数设置的值完全相同。),然后在此之后成功触发了单击。
我还在不同的地方使用过setTimeout()
,因为在某些表单字段中设置值之前代码执行得太快了。
因此,如果有人遇到类似的问题,那么请确保您研究您尝试提交的页面或表单的行为。