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

时间:2017-05-26 15:52:13

标签: javascript c# jquery .net winforms

我正在使用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控件的问题。所以现在我转移到另一个浏览器控件并测试它上面的代码。会告诉你它是否在那里工作。

13 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

使用以下条件尝试

  
      
  1. trigger('click')代替click
  2.   
  3. 使用if(saveLink)更改if条件验证。验证null,undefined所有虚假陈述
  4.   
  5. 使用number=> 0代替sting =>'0'
  6. 返回   
  7. anchor标记重定向与window.location.href一起使用,并通过attr('href')
  8. 从锚点获取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;
}

工作示例

&#13;
&#13;
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;
&#13;
&#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(),因为在某些表单字段中设置值之前代码执行得太快了。

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