2013-10-30 114 views
0

所以,我有這個按鈕,那不是一個按鈕,但實際上是三個單獨的表格單元(不知道爲什麼)。但是我不能單擊它,即使通過單擊該表或指定位於表的範圍內的點。我想知道是否有更好的方法去點擊這個「按鈕」或至少運行它後面的腳本,以便表單可以完全一樣。Selenium Webdriver,點擊一個不是按鈕的按鈕

<div title="Submit" id="saveUserButton" style="float: right;" fire="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" observe="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" stopObserving="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" visible="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" toggle="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" hide="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" show="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" remove="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" update="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" replace="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" insert="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" wrap="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" inspect="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" recursivelyCollect="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" ancestors="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" descendants="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" firstDescendant="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" immediateDescendants="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" previousSiblings="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" nextSiblings="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" siblings="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" match="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" up="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" down="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" previous="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" next="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" select="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" adjacent="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" identify="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" readAttribute="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" writeAttribute="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" getHeight="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" getWidth="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" classNames="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" hasClassName="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" addClassName="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" removeClassName="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" toggleClassName="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" cleanWhitespace="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" empty="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" descendantOf="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" scrollTo="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" getStyle="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" getOpacity="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" setStyle="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" setOpacity="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" getDimensions="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" makePositioned="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" undoPositioned="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" makeClipping="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" undoClipping="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" cumulativeOffset="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" positionedOffset="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" absolutize="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" relativize="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" cumulativeScrollOffset="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" getOffsetParent="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" viewportOffset="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" clonePosition="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" getElementsBySelector="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" childElements="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" _extendedByPrototype="function() { }" getElementsByClassName="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" childOf="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" morph="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" visualEffect="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" highlight="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" fade="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" appear="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" grow="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" shrink="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" fold="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" blindUp="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" blindDown="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" slideUp="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" slideDown="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" pulsate="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" shake="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" puff="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" squish="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" switchOff="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" dropOut="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" getInlineOpacity="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" forceRerendering="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" setContentZoom="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" collectTextNodes="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" collectTextNodesIgnoreClass="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}" getStyles="function() { 
    return __method.apply(null, [this].concat($A(arguments))); 
}"> 
     <table id="saveUserButton_GlassButtonInnerTable" style="height: 24px;" border="0" cellSpacing="0" cellPadding="0"> 
      <tbody> 
       <tr> 
        <td style="background-image: url(//GlassButton/EnabledLeft.gif); MIN-WIDTH: 6px; width: 6px;"/> 
        <td style="background-image: url(//GlassButton/EnabledCenter.gif); PADDING-BOTTOM: 0px; padding-left: 5px; padding-right: 5px; background-repeat: repeat-x; height: 24px; color: white; overflow: auto; padding-top: 0px;"> 
        <td style="background-image: url(//GlassButton/EnabledRight.gif); MIN-WIDTH: 6px; width: 6px;"/> 
       </tr> 
      </tbody> 
     </table> 
    </div> 

不管怎麼說,這是一個用戶界面的一部分,它只有當我填寫表格到標準被啓用。我使用點擊「按鈕」的Java代碼低於:

//Assuming WebDriver driver works correctly 
    WebDriver driver; 
    WebElement submit = driver.findElement(By.id("saveUserButton")); 
    submit.click(); 

我預期的結果是,webdriver的點擊「按鈕」,然後移動到測試的一個部分。

我的最終結果是,驅動程序沒有點擊「按鈕」,因此停留在用戶界面上,無法繼續。

+0

您是否嘗試過使用[動作]的TD或表格元素上點擊(https://code.google .com/p/selenium/wiki/AdvancedUserInteractions)課程? – Faiz

+0

@Faiz,我試過使用它,但它也沒有工作。 – Msmith

回答

0

你將不得不使用JavascriptExecutor來點擊一個不是鏈接或按鈕的元素(Selenium本身無法做到這一點)。

JavascriptExecutor js = (JavascriptExecutor) driver; 
js.executeScript("document.querySelector(\"a[id$='saveUserButton']\").click()"); 
+0

似乎點擊「按鈕」,但它仍然沒有效果。有沒有辦法讓它在按鈕後面運行javascript? – Msmith

+0

是的,@lastexile是對的,fire不是HTML屬性,所以使用'onclick'代替它。您是否在自動化測試之前手動測試該網頁? –

+0

我通常手工完成所有的測試,它工作得很好。假設在IE中使用,IE和一些古怪的東西工作。另外,這裏的開發人員使用C#編寫它,我幾乎沒有接觸到它。不知道這是否會解釋任何事情。有趣的是,他們製作這個按鈕的方式,我只在整個網站上看過一次,其他一切似乎都可以通過Selenium很好地工作。 – Msmith

0

我以前從來沒有見過「fire」屬性,你不會使用「onClick」嗎?

0

如果要直接執行任何屬性上指定的JavaScript,可以使用getAttribute()獲取腳本,然後使用JavascriptExecutor執行。

對於如:執行包含在div元素的fire屬性的腳本:

WebElement submit = driver.findElement(By.id("saveUserButton")); 

//get the script on 'fire' 
String script = submit.getAttribute("fire"); 

//execute 
JavascriptExecutor js = (JavascriptExecutor) driver; 
js.executeScript(script); 
+0

不幸的是,這並不會導致提交表單,儘管它似乎找到了腳本並且它確實嘗試運行它。 – Msmith

+0

在我看來,像'prototype'這樣的javascript框架(與開發人員一起檢查)正被用於創建此按鈕。如果你注意到,所有的屬性('fire','observe'等)都有相同的腳本。還有更多涉及,我們在這裏沒有看到。我會建議詢問開發人員如何實現它(如提交時運行的腳本),或者使用[Fiddler](http://fiddler2.com/)等調試代理來查看手動單擊按鈕時會發生的情況。 – Faiz