2012-03-07 44 views
8

Tôi có một điều khiển chọn trên trang web của mình. Tôi đang sử dụng các đối tượng trang để tương tác với trang. Nếu tôi làm (với 2 dòng đầu tiên trong lớp của tôi và selectByValue theo phương pháp của tôi)selenium webdriver chọn phần tử

@FindBy(id="foo") 
private Select foo; 

foo.selectByValue("myValue"); 

Nó không có con trỏ rỗng. Tôi cũng đã thử mà không cần @FindBy.

Bây giờ nếu tôi làm điều này trong phương pháp của tôi tất cả hoạt động tốt và chọn mục đúng

Select foo = new Select(sDriver.findElement(By.id("foo"))); 
foo.selectByValue("myValue"); 

Dưới đây là đoạn mã thực tế web cho điều khiển (chỉnh sửa để bảo vệ người vô tội)

<select id="foo" name="service_name"> 
    <option selected="selected" value="one">one</option> 
    <option value="two">two</option> 
    <option value="three">three</option> 
</select> 

Hãy để tôi nói rằng tôi có một công việc xung quanh cho vấn đề của tôi nhưng Tôi không hiểu tại sao đường dẫn "bình thường" không hoạt động.

Trả lời

17

Thats vì lớp Select có constructor này:

Select(WebElement element) 

Xem Javadoc

Vì vậy, nếu bạn làm điều gì đó như thế này:

@FindBy(id="foo") 
private WebElement wannabeSelect; 
Select realSelect = new Select(wannabeSelect); 
realSelect.selectByValue("myValue"); 

Nó sẽ làm việc.

BTW, tôi đang sử dụng cách tiếp cận tương tự như bạn trong "workaround" bởi vì tôi không muốn cast đối tượng WebElement mới khi tôi cần chọn đối tượng. Nhưng dù sao, các

sDriver.findElement(By.id("foo")); 

trả về WebElement, vì vậy đó là lý do tại sao nó hoạt động. Bạn cũng có thể làm điều này:

WebElement wannabeSelect = sDriver.findElement(By.id("foo")); 
Select foo = new Select(wannabeSelect); 
+0

ahh có ý nghĩa nó chỉ có vẻ như nó nên đã làm việc vì vậy tôi không bao giờ thực sự đào sâu. Lỗi của tôi. Cảm ơn bạn – ducati1212

+0

Lưu ý: nếu bạn bao gồm khai báo Chọn và bỏ trong lớp của bạn, ngay dưới khai báo WebElement riêng, bạn sẽ nhận được các lỗi thời gian chạy khi lớp được khởi tạo; để tránh điều này, bạn có thể đặt tờ khai Chọn và lớp trong phương thức tương tác với điều khiển màn hình. Một lần nữa không lý tưởng, nhưng nó dường như làm việc. –

+0

với cách tiếp cận này, các pageobjects nên được khởi tạo sau khi trang đã được tải đầy đủ và đối tượng có mặt và hiển thị trong trình điều khiển. Để được ủy quyền, hãy xem [triển khai của tôi] (http://stackoverflow.com/questions/35931667/select-object-on-seleniums-pagefactory/36004572#36004572) – rrw

2

Có hai cách để chọn giá trị tùy chọn:

Một:

// Denotes option value - technical name 
select.selectByValue(fieldValue);  

Hai:

// Denotes option text that is actually visible to be selected 
select.selectByVisibleText(fieldValue); 
+0

và select.selectByIndex (intValue) – dmeehan

1

cách khác tôi đạt được điều này là bằng cách sử dụng phương pháp dưới đây cho tất cả các hộp dropdownselection onchange của tôi. Vượt qua id và lựa chọn và nó hoạt động

public void onchangedropdownselection(String object, String value) { 
     driver.findElement(By.id(object)).sendKeys(value); 
     driver.findElement(By.id(object)).sendKeys(Keys.UP); 
     driver.findElement(By.id(object)).sendKeys(Keys.DOWN); 
    } 

Bằng cách lên xuống chúng ta đang initialzing kịch bản onchange .......

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