2015-02-18 14 views
5

Tôi đã từng đi tìm một cách để truy cập một trường văn bản không nhìn thấy bằng cách sử dụng trình duyệt web của selenium. Cách duy nhất tôi đã nhận nó để làm việc đang sử dụngLàm cách nào để sử dụng biến python trong javascript?

driver.execute_script("document.getElementById('text_field').value+='XYZ'") 

Tuy nhiên, thay vì sử dụng XYZ, tôi muốn sử dụng các biến python.

Trả lời

0

Nếu tôi hiểu vấn đề một cách chính xác bạn đang cố gắng để vượt qua một var thay vì cứng mã hoá XYZ

driver.execute_script("document.getElementById('text_field').value+='" + var + "'"); 
+0

Cảm ơn đã sửa @Jossef – Saifur

1

Trừ khi tôi là misisng cái gì đó, một lựa chọn là:

driver.execute_script("document.getElementById('text_field').value+='{0}'".format(foo)) 
2

Bạn cần để có được một chuỗi JavaScript biểu diễn giá trị của biến Python của bạn, và chèn nó vào lệnh JavaScript của bạn. May mắn thay, mô-đun json của Python sẽ làm điều này cho bạn.

from json import dumps 

driver.execute_script("document.getElementById('text_field').value+=" + 
         dumps(my_python_variable)) 

Tôi sẽ cảnh giác khi chỉ chèn giá trị vào dấu ngoặc kép như các câu trả lời khác đã được hiển thị. Điều gì sẽ xảy ra nếu giá trị đã có dấu ngoặc kép trong đó hoặc các ký tự đặc biệt cần phải thoát? Điều gì sẽ xảy ra nếu nó không phải là một chuỗi? json.dumps sẽ xử lý tất cả các định dạng cần thiết và thoát cho bạn, phù hợp với loại biến của bạn.

+0

Perfect câu trả lời với đầy đủ thông tin để cung cấp cho tôi những ấm áp và mờ! –

+0

Nếu bạn thích, hãy chấp nhận nó! – kindall

5

Cách thông thường để vượt qua các biến vào mã JavaScript bạn thực hiện thông qua Selenium là chỉ cần vượt qua các biến để execute_script:

foo = "something" 
driver.execute_script(""" 
var foo = arguments[0]; 
document.getElementById('text_field').value += foo; 
""", foo) 

Bạn lấy đối số ở phía bên Javascript qua arguments object. Bạn có thể làm điều này vì mã bạn vượt qua để execute_script được gói trong một chức năng vì vậy những gì được thực hiện là một cái gì đó như:

function() { 
    var foo = arguments[0]; 
    document.getElementById('text_field').value += foo; 
} 

và hàm được gọi với các đối số được truyền cho execute_script. Các đối số được sắp xếp tự động bởi Selenium.

Interpolating với .format hoặc concatenating chuỗi nhiều cách mong manh để làm điều đó. Ví dụ nếu bạn làm 'var foo = "' + foo + '"' này sẽ phá vỡ càng sớm càng biến foo của bạn có một dấu nháy kép vào nó (cùng với 'var foo = "{0}"'.format(foo)). Sử dụng json.dumps đang xảy ra để tránh điều này và sẽ làm việc trong hầu hết các trường hợp, nhưng nó không chăm sóc một cái gì đó như thế này:

el = driver.find_element(".something") 

// Do stuff with el on the Python side. 

driver.execute_script(""" 
var el = arguments[0]; 
// Do something with el on the JavaScript side. 
""") 

Selenium biết làm thế nào để chuyển đổi các Python đối tượng nó mang lại cho bạn khi bạn tìm thấy một đối tượng đến một DOM đối tượng ở phía JavaScript. json.dumps không làm điều này.

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