2013-06-26 82 views
9

Tôi đang cố mở một tab mới HOẶC một cửa sổ mới trong trình duyệt bằng selenium cho python. Nó không quan trọng lắm nếu một tab mới hoặc cửa sổ mới được mở ra, điều quan trọng là một phiên bản thứ hai của trình duyệt được mở ra.Làm thế nào để mở một cửa sổ mới trên trình duyệt bằng cách sử dụng Selenium WebDriver cho python?

Tôi đã thử một số phương pháp khác nhau và chưa có phương pháp nào thành công.

  1. Chuyển sang một cửa sổ mà không tồn tại với hy vọng rằng nó sau đó sẽ mở ra một cửa sổ mới khi thất bại trong việc xác định vị trí cho biết cửa sổ:

    driver.switch_to_window(None)

  2. lặp lại qua cửa sổ đang mở (mặc dù có hiện tại chỉ có một)

    for handle in driver.window_handles: 
        driver.switch_to_window(handle) 
    
  3. Cố gắng mô phỏng một phím bấm phím

    from selenium.webdriver.common.keys import Keys 
    driver.send_keys(Keys.CONTROL + 'T') 
    

Vấn đề với cái này đặc biệt là nó dường như không thể gửi chìa khóa trực tiếp vào trình duyệt, chỉ để một yếu tố cụ thể như thế này:

driver.find_element_by_id('elementID').send_keys(Keys.CONTROL + 'T') 

Tuy nhiên, khi một lệnh như thế này được gửi đến một phần tử, nó dường như hoàn toàn không làm gì cả. Tôi đã cố gắng để xác định vị trí các phần tử HTML trên cùng trên trang và gửi các phím đó, nhưng đã một lần nữa gặp thất bại:

driver.find_element_by_id('wrapper').send_keys(Keys.CONTROL + 'T') 

Một phiên bản của này, tôi tìm thấy trên mạng, và đã không thể xác minh tính hợp lệ hoặc thiếu của nó đó vì tôi không chắc chắn những gì lớp/mô-đun mà cần nhập khẩu

act = ActionChains(driver) 
act.key_down(browserKeys.CONTROL) 
act.click("").perform() 
act.key_up(browserKeys.CONTROL) 

cái gì đó rất tương tự với cú pháp khác nhau (tôi không chắc chắn nếu một hoặc cả hai trong số này là đúng cú pháp)

actions.key_down(Keys.CONTROL) 
element.send_keys('t') 
actions.key_up(Keys.CONTROL) 
+0

Điều đó chỉ dành cho các trình duyệt đầu wor, Firefox, Chrome, v.v. Ví dụ: PhantomJS không có ràng buộc khóa và bạn cần gọi 'execute_script()' với mã javascript thích hợp. Trường hợp bạn cần phải chuyển các mục/cookie, chỉ cần tạo liên kết target = _blank sau đó nhấp vào nó trước đó. – erm3nda

Trả lời

12

Làm thế nào về bạn làm điều gì đó như thế này

driver = webdriver.Firefox() #First FF window 
second_driver = webdriver.Firefox() #The new window you wanted to open 

Tùy thuộc vào cửa sổ bạn muốn tương tác với, bạn gửi lệnh phù

print driver.title #to interact with the first driver 
print second_driver.title #to interact with the second driver 

Đối với tất cả xuống cử tri:


OP yêu cầu "it is only important that a second instance of the browser is opened. ". Câu trả lời này không bao gồm TẤT CẢ các yêu cầu có thể có của từng trường hợp sử dụng của mỗi người và của mọi người. Các câu trả lời khác bên dưới có thể phù hợp với nhu cầu cụ thể của bạn.

+0

Hoàn hảo! Đơn giản nhưng nó đã đạt được chính xác những gì tôi mong muốn, cảm ơn bạn. Tuy nhiên, có cách nào để khái quát hóa lệnh đó sao cho nó hoạt động bất kể trình duyệt đang được sử dụng? Có lẽ một cách để lấy được trình duyệt đang được sử dụng trong trình điều khiển đầu tiên để mở trình duyệt thứ hai? –

+0

@ "Có lẽ một cách để lấy được trình duyệt đang được sử dụng trong trình điều khiển đầu tiên để mở thứ hai?" - Tôi không chắc chắn giá trị này sẽ thêm vào điều gì. Ngay cả khi nó có. Tôi xin lỗi tôi không biết làm thế nào để làm điều đó. Dù sao, nếu bạn thấy câu trả lời này hữu ích, bạn có thể đánh dấu câu trả lời này là câu trả lời, đây là cách - http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 – Amey

+4

Điều này thực sự sẽ mở ra một phiên bản thứ hai của Firefox. Sự khác biệt giữa "cửa sổ mới trong trình duyệt hiện tại" so với "ứng dụng trình duyệt hoàn toàn mới" có thể quan trọng đối với một số trường hợp kiểm tra. – ManicDee

9

Bạn có thể sử dụng execute_script để mở cửa sổ mới.

driver = webdriver.Firefox() 
driver.get("https://linkedin.com") 
driver.execute_script("$(window.open('https://twitter.com'))") 
print driver.current_window_handle 

# Switch to new window 
driver.switch_to_window(driver.window_handles[-1]) 
print " Twitter window should go to facebook " 
print "New window ", driver.title 
driver.get("http://facebook.com") 
print "New window ", driver.title 

# Switch to old window 
driver.switch_to_window(driver.window_handles[0]) 
print " Linkedin should go to gmail " 
print "Old window ", driver.title 
driver.get("http://gmail.com") 
print "Old window ", driver.title 

# Again new window 
driver.switch_to_window(driver.window_handles[1]) 
print " Facebook window should go to Google " 
print "New window ", driver.title 
driver.get("http://google.com") 
print "New window ", driver.title 
+1

Không có đề cập trong đó để tải Jquery, và bạn đang giả định nó được nạp bởi các url trước đó nạp với PhantomJS. Ngoài ra, mã javascript là như nhau, do đó, chỉ 'driver.execute_script (" window.open ('https://twitter.com') ")' sẽ hoạt động. – erm3nda

4

Tôi khuyên bạn nên sử dụng lệnh CTRL + N trên Firefox để giảm mức sử dụng bộ nhớ ít hơn để tạo phiên bản trình duyệt mới.

import selenium.webdriver as webdriver 
from selenium.webdriver.common.keys import Keys 

browser = webdriver.Firefox() 
body = browser.find_element_by_tag_name('body') 
body.send_keys(Keys.CONTROL + 'n') 

Cách chuyển đổi và kiểm soát các cửa sổ đã được đề cập bởi Dhiraj.

+0

Đây là giải pháp tốt nhất, vì cửa sổ được mở trong cùng một trình điều khiển. Nhưng điều này sẽ không hoạt động đối với các trang XML. – Andrew

+1

@ fx-kirin Nó không hoạt động trong trình duyệt firefox? –

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