2017-05-04 41 views
0

我試圖在保存按鈕上單擊一下。 Html的保存按鈕:錯誤:使用動態Xpath訪問元素時,元素不可見,而相對Xpath正常工作

<div class="button button--large ng-binding" ng-click="params.applyWrapper()">Save</div> 

現在,當我使用相對xpath得到一個點擊它工作正常。沒有錯誤出現,點擊這個元素是成功的。

driver.findElement(webdriver.By.xpath(".//*[@id='navcontainer']/ons-page[4]/div[2]/div/ng-form/fieldset/ul/li[8]/div")).click(); 

但是,使用下面給出的動態的XPath產生錯誤「ElementNotVisibleError:元素不可見」

driver.findElement(webdriver.By.xpath(".//div[contains(text(),'Save')]")).click(); 

可能是這個原因,我如何使用動態的XPath獲得點擊這個元素是什麼?

+0

使用顯式等待按鈕可見並嘗試。可能有這樣的機會,你的第一個xpath定位父節點so element中的元素,但是在你的動態xpath中,它正在從該節點本身定位元素所以它是不可見的,因爲它可能需要時間才能看到 – NarendraR

+0

嗨@NarendraRajput ..根據你的建議,我試着找到第一個元素,然後等待它是可見的,如下所示'var button = driver.wait(webdriver.until.elementLocated(webdriver.By.xpath(「// div [contains(文本(), '保存')「))); driver.wait(until.elementIsVisible(button))。click();'等待是無限的。驅動程序繼續等待元素可見。使用絕對Xpath,它沒有時間訪問元素。有些東西是可疑的。 –

+0

你在哪裏添加了在這段代碼中等待的時間? – kushal

回答

0

解釋爲什麼元素不可見錯誤出現了,前一頁也有一個'保存'按鈕,因爲在大多數實現中,我們不銷燬前一頁,只隱藏它,webdriver找到保存按鈕上一頁但由於它隱藏而無法訪問它,因此錯誤元素不可見。 使用絕對xpath有效地區別前一頁和當前頁面上的保存按鈕,而「保存」按鈕的動態xpath完全相同。 (由於沒有屬性,使不同的XPath。)

driver.findElement(By.xpath("//*[text()='Save']")).click(); 

現在,我們需要一種方法來使兩者的「保存」按鈕,不同的動態的XPath。 這可以通過使用Xpath座標軸方法來完成。在這個方法中,我們確定一個元素在元素之前或之後被訪問,並寫入一個關於這個前面/後面元素的xpath。

在我的情況下,當前頁面上的「保存」按鈕前面有一個輸入標籤,前一頁上的保存按鈕前面有一個span標籤。這使我能夠區分的XPath兩種這些按鈕如下:

的XPath當前頁面上的保存按鈕:

driver.findElement(By.xpath("//input[@name='defaults']//following::div[1]")).click(); 

//以下:: DIV [1]在這個XPath代表'保存'按鈕之前是一個輸​​入標籤。

的Xpath對前一頁上的保存按鈕:

driver.findElement(By.xpath("//span[text()='Test']//following::div[1]")).click(); 

//以下:: DIV [1]在此XPath代表被一個範圍標記前面加上 '保存' 按鈕。

0

正如你所提到的這種絕對的XPath工作:

driver.findElement(webdriver.By.xpath(".//*[@id='navcontainer']/ons-page[4]/div[2]/div/ng-form/fieldset/ul/li[8]/div")).click(); 

這個邏輯的XPath也應該工作以及:

driver.findElement(webdriver.By.xpath("//div[@class='button button--large ng-binding'][text()='Save']")).click(); 

當你面對ElementNotVisibleError: element not visible異常,可以爲元素添加一些ExplicitWait &然後點擊如下:

WebElement myElement = (new WebDriverWait(driver, 15)).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='button button--large ng-binding'][text()='Save']"))); 
myElement.click(); 

讓我知道這是否對你有幫助。

+0

同樣的錯誤「ElementNotVisibleError:元素不可見」。 –

+0

@PawanJuyal更新了我的答案。讓我知道狀態。謝謝 – DebanjanB

+0

我沒有用wait來檢查這個元素的可見性。沒有工作。我發現安德森在這個問題上的分析是有效的。該元素存在於上一頁以及當前頁面上,並且驅動程序必須與當前隱藏的頁面上的元素進行交互。這就是爲什麼我得到這個錯誤。現在問題是如何訪問當前頁面上的這個元素。 –