Nhận giá trị trả về của mã Javascript trong Selenium


102

Tôi đang sử dụng Selenium2 cho một số kiểm tra tự động trên trang web của mình và tôi muốn có thể nhận được giá trị trả về của một số mã Javascript. Nếu tôi có một foobar()hàm Javascript trong trang web của mình và tôi muốn gọi hàm đó và nhận giá trị trả về vào mã Python của mình, tôi có thể gọi hàm nào để thực hiện điều đó?

Câu trả lời:


166

Để trả về một giá trị, chỉ cần sử dụng returntừ khóa JavaScript trong chuỗi được chuyển đến execute_script()phương thức, ví dụ:

>>> from selenium import webdriver
>>> wd = webdriver.Firefox()
>>> wd.get("http://localhost/foo/bar")
>>> wd.execute_script("return 5")
5
>>> wd.execute_script("return true")
True
>>> wd.execute_script("return {foo: 'bar'}")
{u'foo': u'bar'}
>>> wd.execute_script("return foobar()")
u'eli'

Nếu biến không được định nghĩa bởi javascript, giá trị trả về sẽ là gì? Nó có ném ra một ngoại lệ hay đơn giản là một chuỗi rỗng không?
Alex

nếu biến không được định nghĩa, nó sẽ trảNone
dbJones

7
ghi chú nhanh cho những newbs đó, return_value = wd.execute_script("return {foo: 'bar'}")sẽ lưu trữ giá trị trả về để sử dụng sau này trong chương trình của bạn.
ntk4,

1
các doc thiếu các quy định cụ thể một Retruns: lưu ý. Mặc dù trong teir Cách sử dụng: mẫu họ đặt một js trả về tiêu đề tài liệu. Tốt hơn nên chỉ định rõ ràng Số lần truy cập: trong tài liệu của họ
woodz

7

Bạn có thể trả về các giá trị ngay cả khi bạn không có đoạn mã được viết dưới dạng một hàm như trong mã ví dụ bên dưới, bằng cách thêm return var;vào cuối, nơi var là biến bạn muốn trả về.

result = driver.execute_script('''cells = document.querySelectorAll('a');
URLs = []
console.log(cells);
[].forEach.call(cells, function (el) {
    if(el.text.indexOf("download") !== -1){
    //el.click();
    console.log(el.href)
    //window.open(el.href, '_blank');
    URLs.push(el.href)
    }
});
return URLs''')

resultsẽ chứa mảng trong URLstrường hợp này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.