2015-02-18 13 views
5

Byłem na koniu szuka sposobu na dostęp do niewidocznego pola tekstowego przy użyciu weblover selenu. Jedynym sposobem, mam go do pracy używaJak używać zmiennej python w javascript?

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

Jednak zamiast korzystania XYZ chcę używać zmiennych Pythona.

Odpowiedz

0

Jeśli mam zrozumienia problemu poprawnie próbujesz przekazać var zamiast ciężko kodowane XYZ

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

Dzięki za edycję @Jossef – Saifur

1

ile mam misisng coś, jedną z opcji jest:

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

Trzeba aby uzyskać ciąg znaków JavaScript reprezentujący wartość zmiennej Python i wstaw ją do komendy JavaScript. Na szczęście moduł Pythona json zrobi to za Ciebie.

Byłbym nieufny po prostu wstawieniu wartości do cudzysłowów, jak pokazały się inne odpowiedzi. Co jeśli wartość ma już w sobie znaki cudzysłowu lub znaki specjalne, które wymagają ucieczki? A co, jeśli to w ogóle nie jest łańcuch? json.dumps zajmie się wszystkimi niezbędnymi formatowaniem i unikaniem dla ciebie, stosownie do typu twojej zmiennej.

+0

Doskonała odpowiedź z wystarczającą ilością informacji, aby dać mi ciepłe i rozmyte! –

+0

Jeśli Ci się spodobało, możesz to zaakceptować! – kindall

5

normalny sposób przekazać zmienne do kodu JavaScript wykonać przez Selen jest po prostu przekazać zmienne do execute_script:

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

można pobierać argument po stronie JavaScript przez arguments object. Można to zrobić, ponieważ kod można przejść do execute_script zapakowane jest w funkcję tak, co jest wykonywane jest coś takiego:

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

a funkcja nazywa się z argumentami, które zostały przekazane do execute_script. Argumenty są szeregowane automatycznie przez Selenium.

Interpolowanie z .format lub łączenie łańcuchów to delikatne sposoby na zrobienie tego. Na przykład, jeśli zrobisz 'var foo = "' + foo + '"', to pęknie, jak tylko twoja zmienna foo ma podwójny cudzysłów (to samo z 'var foo = "{0}"'.format(foo)). Korzystanie json.dumps będzie uniknąć tego i będzie działać w większości przypadków, ale nie dbać o coś takiego:

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. 
""") 

Selen wie jak konwertować Python object to daje, gdy znajdziesz obiektu do DOM obiekt po stronie JavaScript. json.dumps nie robi tego.

Powiązane problemy