2017-05-26 13 views
9

我正在開發使用WinForms WebBrowser控件的web機器人。一切工作正常,除了在下面的代碼的第二click()電話:JQuery單擊()錨點標記不啓動從WebBrowser控件內的注入腳本

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。

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

你期待saveLink.click()做什麼?請記住,saveLink不存在jQuery對象。這是元素,因爲您在普通元素上執行[0]而不是eq(0)並單擊()不會導致任何綁定jQuery的點擊處理程序執行。 – Taplar

+0

對於那些說你需要將'saveLink'包裝在'$()'中。 '.click()'是一個DOM函數,它不是** jQuery函數,jQuery有'.click()'將事件處理函數綁定到onclick,即它是'.on 「click」,)' –

+0

@NickA http://api.jquery.com/click/#click click()的第三個選項確實也存在於jQuery中。這是一個簡短的手觸發('點擊') – Taplar

回答

0

謝謝大家對你的答案和評論。

經過一週的時間研究第三方網站,今天終於找到了解決我的問題的辦法。其實問題不在於JavaScript或HTML,而在於網站驗證我嘗試使用我的機器人自動填充的表單。

我對評論中的對話給予我一些提示的答案給予了賞金。

點擊saveLink沒有啓動,因爲我使用.val()以編程方式設置文本框的值,但由於某些原因,網站並未保存使用此功能直接設置的值。但是當我使用從服務器爲文本框加載值的組合框改變值時(雖然從服務器設置的值或使用val()函數的值完全相同),然後點擊成功激發。

我還在各個地方使用了setTimeout(),因爲在某些表單字段中可以設置值之前,代碼執行得太快。

所以在未來,如果有人面臨類似的問題,那麼確保你研究你試圖提交的頁面或表單的行爲。

1

您必須包裝與jQuery你的對象,以使其工作:

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

HTMLElement對象也有一個'click()'方法:https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click –

+3

不要重新包裝。使用eq(0)而不是[0] – Taplar

+0

@Taplar,很好! – Ursache

0

saveLink將永遠null,因爲find/eq總是會返回一個jQuery對象,無論是否有一個或多個元素是否存在。

相反,嘗試使用length屬性來檢查是否存在:

if (saveLink.length) 
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"; 
} 
+0

不工作。沒有找到功能。而'live()'已棄用。最有可能從庫中刪除:http://api.jquery.com/category/removed/ –

0

savelink應該是空檢查DOM元素

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

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

Ø r

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

我嘗試了所有三種方法。 SaveLink不爲空,但不會觸發點擊。 –

+0

您是否嘗試過onclick =「javascript:..」而不是「href =」javascript:.. –

+0

我無法編輯HTML。這是第三方網站。 –

0

我不明白 你需要點擊或添加功能的點擊?

增加功能:

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

點擊:

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

我需要觸發錨點標籤上的點擊。第二個。但它不起作用。 –

0

泰斯特使用jQuery的。

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

試試這個

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

+0

它在點擊時執行此功能中的代碼,但不執行鏈接的原始操作。我不是試圖將新的點擊動作綁定到此鏈接,而是在第三方網站上執行操作。操作是將該記錄保存在該網站的數據庫中。我正在開發一個bot。 –

+0

試試這個然後'$(saveLink).click(),在那裏放置一個斷點,看看如果saveLink是!=未定義,如果它應該工作' – abelh2200

+0

當您構建一個WinForms時,JavaScript中的斷點不起作用項目。但是我通過執行'alert(saveLink.html())'來檢查'saveLink!= undefined',並且它成功地獲取了HTML。 –

0

你更新了建議的解決方案的代碼是好的,但.html()方法獲取一個HTML元素的內容。因此,您需要使用saveLink.parent().html()來獲取錨點的外部HTML。
如果在父容器等元素,你可以創建臨時元素只得到hiperlink HTML:

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

要在saveLink點擊使用JavaScript嘗試使用x.find('a')[0].click()而不是saveLink.click()
爲了視覺清晰,我使用了您的配置文件的URL在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>

+0

好吧,它用於獲取HTML。但是那只是爲了測試'saveLink'是否爲'null'而不是。主要目標是使用Javascript/JQuery單擊'saveLink'而不是獲取HTML。但它不會觸發。 –

+0

@AishwaryaShiva,我已經更新了答案。請再試一次。它有效嗎? – Alexander

+0

試過。不工作。 –

0

最好的辦法從JavaScript

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

觸發一個事件,我希望它會爲你工作。

1

嘗試下面條件的:

  1. trigger('click')而不是click
  2. 更改,如果條件驗證與if(saveLink)。它同時驗證null,undefined所有虛假陳述
  3. 返回與window.location.hrefnumber=> 0代替sting =>'0'
  4. anchor標籤重定向使用得到錨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>

+0

由於錨定'href =「javascript:void()'並將其傳遞給'window.location.href'將會打開空白頁面,因此無法工作。 –

0

記住一點JavaScript和JavaScript框架是事件驅動,所以請不要試圖實現功能的編程概念

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

我的這個理論是什麼,該點擊功能實際上並沒有被綁定到元素上。這可能是由於當腳本或點擊的綁定被執行時html尚未出現在頁面中。嘗試檢查saveLink.click()中的綁定點擊。

儘量使其格式

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