2011-12-07 7 views
9

Tôi cần thử nghiệm chức năng định vị địa lý JS với Selenium và tôi đang sử dụng chromedriver để chạy thử nghiệm trên Chrome mới nhất.Làm cách nào để bật hỗ trợ định vị địa lý trong chromedriver cho Selenium?

Vấn đề bây giờ là Chrome nhắc tôi bật tính năng Định vị địa lý trong thời gian thử nghiệm và tôi không biết cách nhấp vào thanh nhỏ đó trong thời gian chạy, vì vậy tôi đang tìm cách để bắt đầu chromedriver và chrome với một số tùy chọn hoặc trình kích hoạt để bật tùy chọn này theo mặc định. Tất cả tôi có thể tìm thấy here được tuy nhiên làm thế nào tôi có thể vô hiệu hóa vị trí địa lý hoàn toàn.

Tôi làm cách nào để giải quyết vấn đề này?

Trả lời

9

Trong phần sự cố đã biết của chromedriver wiki họ cho rằng bạn Không thể chỉ định hồ sơ tùy chỉnh

Đây là lý do tại sao có vẻ như với tôi rằng @Sotomajor trả lời về việc sử dụng hồ sơ với Chrome như bạn sẽ làm với firefox sẽ không hoạt động.

Trong một trong các thử nghiệm tích hợp của tôi, tôi đã gặp phải vấn đề tương tự. Nhưng vì tôi không bận tâm đến các giá trị định vị thực, tất cả những gì tôi phải làm là giả lập window.navigator.gelocation

Trong mã thử nghiệm java, hãy giải quyết vấn đề này để tránh thanh thông tin cấp phép của geoloc Chrome.

 
chromeDriver.executeScript("window.navigator.geolocation.getCurrentPosition = 
    function(success){ 
     var position = {"coords" : { 
             "latitude": "555", 
             "longitude": "999" 
            } 
         }; 
     success(position);}"); 

vĩ độ (555) và vĩ độ (999) giá trị ở đây chỉ là giá trị kiểm tra

+0

Đó là một ý tưởng rất hay - được chấp nhận! –

+0

Giá trị trả về phải là số vô hướng không phải là chuỗi. – Meglio

3

Cách tiếp cận đã làm việc với tôi trong Firefox là truy cập trang web đó theo cách thủ công trước, cấp các quyền đó và sau đó sao chép hồ sơ firefox ở đâu đó bên ngoài và tạo cá thể firefox selen với cấu hình đó.

Vì vậy:

  1. cp -r ~/Library/Application \ Support/Firefox/Profiles/tp3khne7.default /tmp/ff.profile

  2. Tạo FF dụ:

    FirefoxProfile firefoxProfile = new FirefoxProfile(new File("/tmp/ff.profile")); 
    FirefoxDriver driver = new FirefoxDriver(firefoxProfile); 
    

Tôi khá chắc chắn rằng điều gì đó tương tự sẽ được áp dụng cho Chrome. Mặc dù api của tải hồ sơ là một chút khác nhau. Bạn có thể kiểm tra xem nó ở đây: http://code.google.com/p/selenium/wiki/ChromeDriver

+0

Cảm ơn gợi ý hữu ích, không hoàn toàn những gì tôi đang tìm kiếm (vì phần máy chủ của URL tôi tải vào có thể thay đổi theo thời gian tôi phải cập nhật hồ sơ mỗi lần hoặc cung cấp các cấu hình khác nhau), nhưng tốt hơn là không có gì bây giờ. –

3

Sau đây là cách tôi đã làm nó với Capybara cho kiểm tra dưa chuột

Capybara.register_driver :selenium2 do |app|  
    profile = Selenium::WebDriver::Chrome::Profile.new 
    profile['geolocation.default_content_setting'] = 1 

    config = { :browser => :chrome, :profile => profile }  
    Capybara::Selenium::Driver.new(app, config) 
end 

Và có liên kết đến cài đặt cấu hình hữu ích khác: pref_names.cc

Hãy nhìn vào "Tweaking tùy chọn tiểu sử "trong RubyBindings

0

Đối với câu hỏi ban đầu của bạn:

Bạn nên khởi động Firefox bằng tay một lần - và chọn cấu hình bạn sử dụng cho Selenium.

Nhập about:permissions vào dòng địa chỉ; tìm tên của máy chủ lưu trữ của bạn - và chọn share location : "allow".

Đó là tất cả. Bây giờ các trường hợp thử nghiệm Selenium của bạn sẽ không thấy hộp thoại trình duyệt đáng sợ không có trong DOM.

0

Đơn giản nhất để đặt geoLocation là chỉ naviaget trên url đó và nhấp vào cho phép vị trí bằng selenium. Đây là mã cho refrence

driver.navigate().to("chrome://settings/content"); 
    driver.switchTo().frame("settings"); 
    WebElement location= driver.findElement(By.xpath("//*[@name='location' and @value='allow']")); 
    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    ((JavascriptExecutor) driver).executeScript("arguments[0].click();", location); 
    WebElement done= driver.findElement(By.xpath("")); 

    driver.findElement(By.xpath("//*[@id='content-settings-overlay-confirm']")).click(); 

    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    driver.navigate().to("url");