2014-07-25 16 views
5

Tôi đang tạo tập lệnh có liên quan đến việc tìm kiếm bản ghi và sau đó cập nhật bản ghi. Trên màn hình tìm kiếm, người dùng có tùy chọn xem các tùy chọn tìm kiếm nâng cao. Để chuyển đổi hiển thị hoặc ẩn tìm kiếm nâng cao được điều khiển bằng một nút.Trình quản trị web Selenium - sử dụng isDisplayed() trong câu lệnh If is not working

<a title="Searches" href="javascript:expandFilters()"><img border="0" align="absmiddle" alt="Advanced" src="****MASKED URL****"></a> 

Sự khác biệt duy nhất giữa các thuộc tính của nút tìm kiếm khi nó được hiển thị hoặc ẩn các tìm kiếm nâng cao là src img:

Khi tìm kiếm nâng cao được giấu src IMG kết thúc với "/ Styles/_Images /advanced_button.jpg ", khi tìm kiếm nâng cao hiển thị, IMG src kết thúc bằng" /Styles/_Images/basic_button.png "

Khi tôi mở trang, đôi khi các tùy chọn tìm kiếm nâng cao hiển thị, đôi khi chúng không . Giá trị mà tôi muốn tìm kiếm xuất hiện trong phần Nâng cao, do đó, để kịch bản của tôi hoạt động, tôi đã thêm câu lệnh IF.

<input type="text" value="" maxlength="30" size="30" name="guiSystemID"> 

Câu lệnh IF tìm kiếm các trường mà tôi cần nhập dữ liệu vào và nếu trường không tồn tại thì sẽ cho biết tùy chọn nâng cao không hiển thị tôi cần nhấp vào nút để mở rộng tùy chọn tìm kiếm.

Tôi đã tạo câu lệnh IF sau.

 if (!driver.findElement(By.name("guiSystemID")).isDisplayed()) { 
     driver.findElement(By.cssSelector("img[alt='Advanced']")).click(); 
    } 

Khi tôi chạy tập lệnh và Tìm kiếm nâng cao được mở rộng thì tập lệnh sẽ chạy thành công. Tuy nhiên, khi tôi chạy kịch bản và tìm kiếm nâng cao không được mở rộng, kịch bản thất bại, khuyên tôi rằng nó không thể tìm thấy đối tượng "guiSystemID". Điều này là bực bội bởi vì nếu nó không thể tìm thấy nó sau đó tôi muốn kịch bản để tiếp tục, nhập vào đường dẫn đúng của câu lệnh IF.

Có ai đó có bất kỳ đề xuất nào về cách tôi có thể đánh giá nếu trường xuất hiện mà không có tập lệnh không thành công vì không thể tìm thấy trường.

Cảm ơn trước

Simon

Trả lời

15

Tôi có thể trả lời trễ câu hỏi này, nhưng có thể giúp người khác tìm kiếm điều tương tự.

Gần đây tôi đã gặp phải sự cố tương tự khi làm việc với isDisplayed(). Mã của tôi giống như thế này

if(driver.findElement(By.xpath(noRecordId)).isDisplayed())                           
{   
    /**Do this*/  
}  
else  
{  
    /**Do this*/  
} 

Mã này hoạt động khá tốt khi phần tử được hiển thị đang cố gắng tìm được hiện diện. Nhưng khi yếu tố vắng mặt, nó tiếp tục tìm kiếm điều đó và do đó ném một ngoại lệ "NosuchElementFound". Vì vậy, không có cách nào mà tôi có thể kiểm tra phần khác.

Tôi đã tìm ra cách để làm việc với điều này (Bao quanh {if, else} với khối try và catch, nói điều gì đó như thế này.

public void deleteSubVar() throws Exception 
{   
    try 
    {  
    if(driver.findElement(By.xpath(noRecordId)).isDisplayed())  
    {  
     /**when the element is found do this*/  
    }  
    }  
    catch(Exception e)  
    {  
    /**include the else part here*/  
    }  
}   

Hope this helps :)

+0

Cảm ơn .... nó đã giúp tôi. –

+0

Khá hữu ích !. Cảm ơn – Deep

+0

Giải pháp này phù hợp với tôi. Cảm ơn bạn. – Automationtested

2

Tôi đã có kết quả khác nhau với .isDisplayed() trong quá khứ. Vì có nhiều phương thức khác nhau để ẩn một phần tử trên DOM, tôi nghĩ nó sẽ giải quyết vấn đề linh hoạt với isDisplayed(). Tôi có xu hướng đưa ra các giải pháp của riêng mình cho việc này. Tôi sẽ chia sẻ một vài điều tôi làm, sau đó thực hiện một đề xuất cho kịch bản của bạn.

Trừ khi tôi có một cái gì đó rất cụ thể, tôi có xu hướng sử dụng một phương pháp bao bọc thực hiện một số kiểm tra cho khả năng hiển thị. Đây là khái niệm, tôi sẽ để cách tiếp cận thực hiện thực tế cho bạn. Đối với các ví dụ chung ở đây, chỉ cần giả định "định vị" là phương pháp lựa chọn vị trí của bạn (CSS, XPath, Tên, ID, v.v.).

Việc kiểm tra đầu tiên và dễ nhất để thực hiện là xem liệu phần tử đó có xuất hiện trên DOM hay không. Nếu nó không có mặt, nó chắc chắn không nhìn thấy được.

boolean isPresent = driver.findElements(locator).size() > 0; 

Sau đó, nếu mà trả về true, tôi sẽ kiểm tra kích thước của các yếu tố:

Dimension d = driver.findElement(locator).getSize(); 
boolean isVisible = (d.getHeight() > 0 && d.getWidth() > 0); 

Bây giờ, kích thước, vào những thời điểm, có thể trở lại một dương tính giả nếu phần tử nào trong thực tế có chiều cao và chiều rộng lớn hơn 0, nhưng, ví dụ, một phần tử khác bao gồm phần tử đích, làm cho nó xuất hiện ẩn trên trang (ít nhất, tôi đã gặp phải điều này một vài lần trong quá khứ). Vì vậy, như một tấm séc cuối cùng (nếu kiểm tra chiều trả về true), tôi nhìn vào thuộc tính style của nguyên tố này (nếu đã được định nghĩa) và thiết lập giá trị của một boolean cho phù hợp:

String elementStyle = driver.findElement(locator).getAttribute("style"); 
boolean isVisible = !(elementStyle.equals("display: none;") || elementStyle.equals("visibility: hidden;")); 

Những công việc cho phần lớn các tình huống hiển thị yếu tố mà tôi gặp phải, nhưng có những lúc mà người phát triển giao diện người dùng của bạn thực hiện điều gì đó khác mà cần phải được xử lý trên chính nó.

Một trường hợp dễ dàng là khi có một lớp CSS xác định khả năng hiển thị phần tử. Nó có thể được đặt tên bất cứ điều gì, vì vậy chúng ta hãy giả sử "ẩn" là những gì chúng ta cần tìm kiếm. Trong trường hợp này, một kiểm tra đơn giản của thuộc tính 'lớp' nên mang lại kết quả phù hợp (nếu có phương pháp trên không làm như vậy):

boolean isHidden = driver.findElement(locator).getAttribute("class").contains("hidden"); 

Bây giờ, đối với tình hình cụ thể của bạn, dựa trên thông tin bạn' đã đưa ra ở trên, tôi khuyên bạn nên thiết lập một giá trị boolean dựa trên đánh giá của thuộc tính "src". Đây sẽ là một cách tiếp cận tương tự để kiểm tra lớp CSS ngay trên, nhưng được sử dụng trong một ngữ cảnh hơi khác, vì chúng ta biết chính xác những thay đổi thuộc tính giữa hai trạng thái. Lưu ý rằng điều này sẽ chỉ hoạt động trong thời trang này nếu có hai trạng thái của phần tử (Nâng cao và Cơ bản, như bạn đã lưu ý). Nếu có nhiều tiểu bang hơn, tôi sẽ xem xét việc thiết lập một giá trị enum hoặc một cái gì đó tương tự. Vì vậy, giả sử phần tử đại diện cho Nâng cao hoặc Cơ bản:

boolean isAdvanced = driver.findElement(locator).getAttribute("src").contains("advanced_button.jpg"); 

Từ bất kỳ phương pháp nào sau đây, khi bạn có giá trị boolean, bạn có thể bắt đầu logic nếu/sau đó.

Lời xin lỗi của tôi vì đã lâu dài với điều này, nhưng hy vọng nó sẽ giúp bạn đi đúng hướng.

+2

Trong khi tôi đồng ý với bạn về "những điều kỳ quặc" mà 'được hiển thị' có thể mang lại, bạn đang thực sự sao chép chính xác những gì nó đã làm. Selenium là nguồn mở sau khi tất cả, mã JS sử dụng cuộc sống [ở đây] (https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L557). Điều này thực hiện chính xác điều tương tự như bạn đang thực hiện (ví dụ: kiểm tra chiều cao và chiều rộng, kiểu hiển thị, v.v.). Bạn cũng có thể kiểm tra thông số WebDriver nơi nó [chi tiết các bước này] (http://www.w3.org/TR/webdriver/#determining-visibility). Cá nhân, nó đi xuống để không có một "một kích thước phù hợp với tất cả" cách kiểm tra nó. – Arran

1

Sử dụng Try Catch bất chấp mục đích rất isdisplayed() được sử dụng như sau: If điều kiện, người ta có thể viết dưới mã mà không sử dụng "nếu"

try{ 
driver.findElement(By.xpath(noRecordId)).isDisplayed(); 
//Put then statements here 
    } 
Catch(Exception e) 
{//put else statement here.} 
-2

isDisplayed() là phương thức boolean, nó trả về true hoặc false. Về cơ bản phương pháp này được sử dụng để tìm xem liệu phần tử đó có đang được hiển thị trên trang web hay không.

Các vấn đề liên quan