2015-02-11 55 views
2

我嘗試使用selenium web驅動程序瀏覽頁面。瀏覽器控制檯無法識別注入硒webdriver的js vars

然後我通過硒web驅動程序注入並執行一些js。

我試圖在這個打開的瀏覽器控制檯中訪問這些變量, 但似乎他們沒有創建。怎麼來的?

我有這樣的代碼:

public void foo(){ 
     String script = 
       "var aLocation = {};" + 
         "var aOffer = {};" + 

         "var aAdData = " + 
         "{ " + 
         "location: aLocation, " + 
         "offer: aOffer " + 
         " };" + 

         "var aClientEnv = " + 
         " { " + 
         " sessionid:  \"\", " + 
         " cookie:  \"\", " + 
         "  lon:   34.847, " + 
         "  lat:   32.123, " + 
         "  venue:   \"\", " + 
         " venue_context: \"\", " + 

         " source:  \"\"," + // One of the following (string) values: ADS_PIN_INFO, 
         // ADS_0SPEED_INFO, ADS_LINE_SEARCH_INFO, 
         // ADS_ARROW_NEARBY_INFO, ADS_CATEGORY_AUTOCOMPLETE_INFO, 
         // ADS_HISTORY_LIST_INFO 
         // (this field is also called "channel") 

         " locale:  \"\"" + // ISO639-1 language code (2-5 characters), supported formats: 
         " };" + 


         "W.setOffer(aAdData, aClientEnv);"; 

      javascriptExecutor.executeScript(script); 
} 

這將產生:

script = var aLocation = {}; var aOffer = {}; var aAdData = { location: aLocation, offer: aOffer }; var aClientEnv = { sessionid: "", cookie: "", rtserver - id: 1, lon: 34.847, lat: 32.123, venue: "", venue_context: "", source: "", locale: "" }; W.setOffer(aAdData, aClientEnv);

我在這個瀏覽器控制檯評估aLocation並獲得"variable not defined"。怎麼會這樣?

enter image description here

回答

1

因爲你的變量不是global。只要你用var聲明他們,他們的範圍。如果你想測試一些東西,只需將nemo=100;放在上面的腳本中,並嘗試在控制檯中打印出來,它應該可以工作。

編輯#1 順便說一句,我絕不是在這裏提倡全局變量。我只是想解釋由WebDriver執行的JS中的變量發生了什麼。如果你想使用全局變量,那麼像window.foo這樣的更明確的聲明更像其他人所建議的那樣。但總體上儘量避免使用它們。此外,儘量避免使用WebDriver首先執行JavaScript ,除非您沒有別的選擇。 WebDriver應該爲你模擬一個真實的用戶,你的用戶不太可能執行一個JavaScript來與你的Web應用程序進行交互。

3

瞭解Selenium如何執行在瀏覽器中執行的JavaScript非常重要。

nilesh's answer暗示在變量聲明之前拍打var不會將其帶出全局空間相反。例如,如果var foo = 1在函數作用域之外執行,它將聲明一個名爲foo的全局變量。

關鍵是Selenium如何執行腳本。這將是可能 Selenium執行在全球空間傳遞到executeScript的腳本。 (有辦法。)但是,它沒有。它所做的是將腳本封裝在一個新函數中,因此在代碼中出現的任何var傳遞給executeScript將聲明一個局部變量。

只要刪除var就可以工作,但我更願意在顯式操作全局空間時使用。我明確地訪問window對象(例如window.foo = 1)。下降var看起來可能是一個錯誤,而使用window.看起來是故意的。

+0

我的答案並不建議使用全局變量。它只是回答關於他的變量發生了什麼的OP問題。另外如果我理解你的權利,你的第二段和第四段是矛盾的。聲明var foo不聲明全局變量foo – nilesh 2015-02-11 21:27:59

+0

你不明白我的答案。 – Louis 2015-02-11 21:29:45

+0

很有可能。我不理解這部分「例如,如果var foo = 1在函數作用域之外執行,它將聲明一個名爲foo的全局變量。」 – nilesh 2015-02-11 21:32:01

相關問題