URL-адрес открытия Selenium Python в том же браузере (новая вкладка) [дубликат]

В следующем примере, который я написал, показано, как

  • обрабатывать асинхронные HTTP-вызовы;
  • Подождать ответа от каждого вызова API;
  • Использовать шаблон promise ;
  • Используйте шаблон Promise.All для объединения нескольких HTTP-вызовов;

Этот рабочий пример является автономным. Он будет определять простой объект запроса, который использует объект window XMLHttpRequest для совершения вызовов. Он будет определять простую функцию, чтобы дождаться завершения кучи обещаний.

Контекст. В этом примере запрашивается конечная точка Spotify Web API для поиска объектов playlist для заданного набора строк запроса:

[
 "search?type=playlist&q=%22doom%20metal%22",
 "search?type=playlist&q=Adele"
]

Для каждого элемента новый Promise запустит блок - ExecutionBlock, проанализирует результат, заплатит новый набор обещаний на основе массива результатов, который представляет собой список объектов Spotify user и выполняет новый HTTP-вызов в ExecutionProfileBlock асинхронно.

Затем вы можете увидеть вложенную структуру Promise, которая позволяет вам генерировать множественные и полностью асинхронные вложенные HTTP-вызовы и присоединять результаты к каждому подмножеству вызовов через Promise.all.

NOTE Recent Spotify search API-интерфейсам потребуется указать токен доступа в заголовках запроса:

-H "Authorization: Bearer {your access token}" 

Итак, вы должны запустить следующий пример, вам нужно поместить маркер доступа в заголовки запроса:

var spotifyAccessToken = "YourSpotifyAccessToken";
var console = {
    log: function(s) {
        document.getElementById("console").innerHTML += s + "
" } } // Simple XMLHttpRequest // based on https://davidwalsh.name/xmlhttprequest SimpleRequest = { call: function(what, response) { var request; if (window.XMLHttpRequest) { // Mozilla, Safari, ... request = new XMLHttpRequest(); } else if (window.ActiveXObject) { // Internet Explorer try { request = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { try { request = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {} } } // State changes request.onreadystatechange = function() { if (request.readyState === 4) { // Done if (request.status === 200) { // Complete response(request.responseText) } else response(); } } request.open('GET', what, true); request.setRequestHeader("Authorization", "Bearer " + spotifyAccessToken); request.send(null); } } //PromiseAll var promiseAll = function(items, block, done, fail) { var self = this; var promises = [], index = 0; items.forEach(function(item) { promises.push(function(item, i) { return new Promise(function(resolve, reject) { if (block) { block.apply(this, [item, index, resolve, reject]); } }); }(item, ++index)) }); Promise.all(promises).then(function AcceptHandler(results) { if (done) done(results); }, function ErrorHandler(error) { if (fail) fail(error); }); }; //promiseAll // LP: deferred execution block var ExecutionBlock = function(item, index, resolve, reject) { var url = "https://api.spotify.com/v1/" url += item; console.log( url ) SimpleRequest.call(url, function(result) { if (result) { var profileUrls = JSON.parse(result).playlists.items.map(function(item, index) { return item.owner.href; }) resolve(profileUrls); } else { reject(new Error("call error")); } }) } arr = [ "search?type=playlist&q=%22doom%20metal%22", "search?type=playlist&q=Adele" ] promiseAll(arr, function(item, index, resolve, reject) { console.log("Making request [" + index + "]") ExecutionBlock(item, index, resolve, reject); }, function(results) { // Aggregated results console.log("All profiles received " + results.length); //console.log(JSON.stringify(results[0], null, 2)); ///// promiseall again var ExecutionProfileBlock = function(item, index, resolve, reject) { SimpleRequest.call(item, function(result) { if (result) { var obj = JSON.parse(result); resolve({ name: obj.display_name, followers: obj.followers.total, url: obj.href }); } //result }) } //ExecutionProfileBlock promiseAll(results[0], function(item, index, resolve, reject) { //console.log("Making request [" + index + "] " + item) ExecutionProfileBlock(item, index, resolve, reject); }, function(results) { // aggregated results console.log("All response received " + results.length); console.log(JSON.stringify(results, null, 2)); } , function(error) { // Error console.log(error); }) ///// }, function(error) { // Error console.log(error); });

Я подробно рассмотрел это решение здесь .

6
задан Robert W. Hunter 10 February 2015 в 16:19
поделиться

6 ответов

Вы можете открыть или закрыть вкладку комбинацией клавиш COMMAND + T или COMMAND + W (OSX). На других ОС вы можете использовать CONTROL + T / CONTROL + W.

В селене вы можете эмулировать такое поведение. Вам нужно будет создать один webdriver и столько вкладок, сколько вам нужно.

Вот код.

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

driver = webdriver.Firefox()
driver.get("http://www.google.com/")

#open tab
driver.find_element_by_tag_name('body').send_keys(Keys.COMMAND + 't') 
# You can use (Keys.CONTROL + 't') on other OSs

# Load a page 
driver.get('http://stackoverflow.com/')
# Make the tests...

# close the tab
# (Keys.CONTROL + 'w') on other OSs.
driver.find_element_by_tag_name('body').send_keys(Keys.COMMAND + 'w') 


driver.close()
18
ответ дан Eugene Primako 5 September 2018 в 09:51
поделиться

С Selenium v3.x открывается веб-сайт в Новая вкладка через Python теперь намного проще. Вот решение, в котором вы можете открыть http://www.google.co.in в начальном TAB TAB и https://www.yahoo.com в соседнем TAB :

  • Code Block :
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("http://www.google.co.in")
    print("Initial Page Title is : %s" %driver.title)
    windows_before  = driver.current_window_handle
    print("First Window Handle is : %s" %windows_before)
    driver.execute_script("window.open('https://www.yahoo.com')")
    WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
    windows_after = driver.window_handles
    new_window = [x for x in windows_after if x != windows_before][0]
    driver.switch_to_window(new_window)
    print("Page Title after Tab Switching is : %s" %driver.title)
    print("Second Window Handle is : %s" %new_window)
    
  • Выход консоли:
    Initial Page Title is : Google
    First Window Handle is : CDwindow-B2B3DE3A222B3DA5237840FA574AF780
    Page Title after Tab Switching is : Yahoo
    Second Window Handle is : CDwindow-D7DA7666A0008ED91991C623105A2EC4
    
  • Снимок браузера:

0
ответ дан DebanjanB 5 September 2018 в 09:51
поделиться

После долгой работы метод ниже работал для меня:

driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't')
driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.TAB)

windows = driver.window_handles

time.sleep(3)
driver.switch_to.window(windows[1])
0
ответ дан Keiwan 5 September 2018 в 09:51
поделиться

Основа определения на веб-сайте селена: в первую очередь, это автоматизация веб-приложений для целей тестирования, но, конечно же, не ограничивается этим. Скучные задачи администрирования через Интернет могут (и должны!) Также быть автоматизированы. вы видите, что главная цель селена предназначена для тестирования, а кроме того, вы можете автоматизировать задачи администрирования, не просматривая веб-сайты. работа с такой вещью для ползания - это просто трата времени. Я должен сосредоточиться на обходе, взгляните на http://scrapy.org , это самая распространенная структура в python для извлечения данных с веб-сайтов.

0
ответ дан Omid Zarin 5 September 2018 в 09:51
поделиться
browser.execute_script('''window.open("http://bings.com","_blank");''')

Где браузер - webDriver

7
ответ дан Supratik Majumdar 5 September 2018 в 09:51
поделиться

Это общий код, адаптированный из других примеров:

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

driver = webdriver.Firefox()
driver.get("http://www.google.com/")

#open tab
# ... take the code from the options below

# Load a page 
driver.get('http://bings.com')
# Make the tests...

# close the tab
driver.quit()

возможными способами были:

  1. Отправка <CTRL> + <T> на один элемент
    #open tab
    driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't')
    
  2. Отправка <CTRL> + <T> через цепочки действий
    ActionChains(driver).key_down(Keys.CONTROL).send_keys('t').key_up(Keys.CONTROL).perform()
    
  3. Выполнение фрагмента javascript
    driver.execute_script('''window.open("http://bings.com","_blank");''')
    
    Для этого вам необходимо убедиться, что предпочтения browser.link.open_newwindow и browser.link.open_newwindow.restriction . Значения по умолчанию в последних версиях в порядке, иначе вам, возможно, понадобится:
    fp = webdriver.FirefoxProfile()
    fp.set_preference("browser.link.open_newwindow", 3)
    fp.set_preference("browser.link.open_newwindow.restriction", 2)
    
    driver = webdriver.Firefox(browser_profile=fp)
    
    проблема в том, что эти настройки заданы другими значениями и заморожены, по крайней мере, селеном 3.4.0. Когда вы используете профиль, чтобы установить их с привязкой java, появляется исключение и с привязкой python новые значения игнорируются. В Java есть способ установить эти настройки без указания объекта профиля при разговоре с geckodriver, но он пока еще не реализован в привязке python:
    FirefoxOptions options = new FirefoxOptions().setProfile(fp);
    options.addPreference("browser.link.open_newwindow", 3);
    options.addPreference("browser.link.open_newwindow.restriction", 2);
    FirefoxDriver driver = new FirefoxDriver(options);
    

Третий вариант перестала работать для python в селене 3.4.0.

Первые два параметра также показались прекратить работу в селене 3.4.0. Они зависят от отправки ключевого события CTRL в элемент. На первый взгляд кажется, что это проблема ключа CTRL, но он терпит неудачу из-за новой функции многопроцесса Firefox . Может быть, эта новая архитектура навязывает новые способы сделать это или, может быть, является временной проблемой реализации. В любом случае мы можем отключить его с помощью:

fp = webdriver.FirefoxProfile()
fp.set_preference("browser.tabs.remote.autostart", False)
fp.set_preference("browser.tabs.remote.autostart.1", False)
fp.set_preference("browser.tabs.remote.autostart.2", False)

driver = webdriver.Firefox(browser_profile=fp)

... а затем вы можете успешно использовать первый способ.

8
ответ дан yucer 5 September 2018 в 09:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: