2012-08-28 39 views
20

我在Selenium WebDriver的測試中遇到問題。當程序嘗試點擊按鈕時,Click事件並不總是有效。在一次測試中,一切都很好,而在其他測試中則不然。Click()方法不會總是有效

每個測試都從一頁開始。首先,用戶必須從select組件中選擇一個選項,然後用戶單擊一個按鈕。

我想知道爲什麼有一次一切正常,當我第二次運行測試時,它不是?

這裏是找到並點擊按鈕的源代碼:

public void clickContinueBtn() {  
    webElement = driver.findElement(By.xpath("//div[@class='btn magenta_s']/a/span")); 
    webElement.click(); 
} 
+0

@saumil說:非常感謝,這是爲我工作 –

+0

相關文章 - http://stackoverflow.com/questions/43011751/how-do-find-out-why-an-element-is-disabled-briefly – testerjoe2

回答

-1

一個可能的原因,這可能是click()方法不能對每個元素分派click事件。

因此,您可以明確激發您嘗試點擊的元素上的click事件。

+0

但是,當我調用click()事件的組件(按鈕也)在其他網頁上工作。 – user1494328

+0

就是這樣。有時會發生'click()'能夠在某些元素上觸發事件,而這些元素在其他頁面上也無法在同一頁面上觸發。因此請嘗試明確點擊點擊事件。 –

+0

對不起,「明確」是什麼意思? – user1494328

15

您還可以嘗試使用基於Javascript的替代方法進行單擊。代碼可以如下:

WebElement element = driver.findElement(By.id("something")); 
JavascriptExecutor executor = (JavascriptExecutor)driver; 
executor.executeScript("arguments[0].click();", element); 
+1

它不起作用。當選擇組件的一個選項被選中時,瀏覽器窗口正在關閉。 – user1494328

18

我遇到了類似的問題。點擊方法在其他頁面上工作,然後在特定頁面上根本無法工作。

一個競爭條件引起的問題:

  1. HTML內容呈現在禁用按鈕。
  2. 在觸發javascript onload事件(或完成執行)之前執行硒web驅動程序腳本。所以button.click會出現在禁用的元素上。沒有什麼會發生。
  3. 然後javascript onload事件將觸發(或完成執行)並且javascript將啓用該按鈕。
  4. 我看着頁面,無法弄清楚爲什麼我的代碼不工作,因爲按鈕似乎在檢查時啓用,如果我手動單擊按鈕,它的工作。

一旦我想通了,這是一個時間問題,我發現這裏的解決方案:How can I get Selenium Web Driver to wait for an element to be accessible, not just present?

套用在Ruby中的解決方案:

//This will not return the button until it is enabled. 
button = driver.find_element(:xpath, "//button[@id='myButtonId' and not(@disabled)]") 
button.click 
+1

這真的對我有幫助,該腳本在其他瀏覽器中完美工作,但在Safari 6和Android瀏覽器中完美無缺,但速度不夠快。感謝分享這個答案! :) –

+0

如何切換iframe並等待onload =「javascript:pageload(); functionalPageLoad();」在Ruby中重新加載頁面? 我發現自己打開頁面內的iframe,我有權訪問它,然後頁面重新加載,我無法再訪問框架。 我已經閱讀了許多關於等待,睡眠,時間,切換到框架然後到父母的答案,但是我無法達到我的目標。 –

+0

如果停留時間僅爲幾毫秒,您如何發現您的元素已被禁用?在我的情況下,點擊在硒第一次嘗試後1-2秒工作。 – testerjoe2

0

我經歷了類似的問題,一對夫婦幾天前,我在我的個案中找到了解決方案。 ===使用Selenium Webdriver,我想點擊「First Link」鏈接,並在頁面上加載內容。

下面的代碼結構一樣我的情況的部分:

<li class="first-link"> 
    <a class="common-style" href="javascript:;" style="padding-left: 15px; padding-right: 15px;">First Link</a> 
</li> 

===結果是,Webelement是應該找到並點擊,但切換到UI,什麼都沒有發生,沒有誤差拋出元素(找不到元素,元素沒有準備好點擊,元素禁用等)。

在嘗試了幾種不同的方法來查找通過(xpath和css,沒有嘗試通過ID,因爲在我的情況下沒有唯一的ID)的鏈接,我能夠訪問和點擊與CSS的Selenium webdriver的元素具有以下值:li.first-link a。 但是,當我嘗試通過xpath訪問以下值時,這是在Firefox中「找到」,但點擊沒有工作:.//li[a/text()='First Link']

這個問題是一個輕微的xpath語法問題,來自Firefox的firebug根本沒有報告,實際上它找到了鏈接。

我改變了括號命令是這樣的:.//li/a[text()='First Link'] 現在按預期工作,第一個鏈接被發現,點擊和加載頁面的JavaScript代碼被激發。

我的發現是: *這不是一個計時問題,所以這不會發生,因爲您嘗試點擊未準備好的元素。否則,我們已經用明確的Selenium等待解決了這個問題...

  • 問題不在於找到了元素,而且JavaScript未被解僱。您可以嘗試直接執行JavaScript代碼並手動觸發事件,並看到這不起作用。
  • 此問題發生在Firefox 22上,可能適用於此瀏覽器的較舊版本。如果這適用於IE或Chrome,我無法提供信息。這個問題本身就是即使在xpath上有語法衝突,firefox也不會拋出異常,這會讓你認爲你的代碼沒有問題,但是有。
  • 這是Firefox意外的未處理行爲。我發現報道這是個Bug: http://code.google.com/p/selenium/issues/detail?id=4757

SOLUTION提示:驗證您的HTML結構,你的XPath,試圖找到問題的語法,找到不同的方式來訪問的元素。

0

看着你的xpath,你還沒有識別出按鈕,而是你正在指向按鈕所在的span標籤。 Selenium點擊跨度而不是按鈕。這就是爲什麼click()不起作用。請使用Id或名稱(如果可用)或更改xpath以包含按鈕標籤。如果您可以發佈html,則可以輕鬆創建xpath。 click()對我來說一直很完美,我一直在項目中使用這種方法一年以上,並且每次都能正常工作...

1

您是否確定沒有計時問題?在找到元素之前先找到一個斷點,然後查看代碼是否正常運行。如果存在計時問題,請在點擊按鈕之前使用明確的等待。還要注意,在實際點擊按鈕之前,該按鈕應該是可點擊的(元素必須可見並且被啓用)。

有明確的等待一個解決方案看起來是這樣的:

By by = By.xpath("//div[@class='btn magenta_s']/a/span"); 
WebDriverWait w = new WebDriverWait(driver, timeout); 
WebElement element = w.waitUntil(ExpectedConditions.elementToBeClickable(by); 
element.click(); 
0

嘗試下面的代碼,有時你是故意要將焦點對你的元素

WebElement element = driver.findElement("yourElement"); 
     Actions builder = new Actions(driver); 
     builder.moveToElement(element).click(element); 
     builder.perform();