python - 在新标签页中打开网页 Selenium + Python

标签 python selenium webdriver phantomjs

所以我试图在我的 WebDriver 内的新标签页上打开网站。我想这样做,因为使用 PhantomJS 为每个网站打开一个新的 WebDriver 大约需要 3.5 秒,我想要更快的速度...

我正在使用一个多进程的python脚本,我想从每个页面中获取一些元素,所以工作流程是这样的:

Open Browser

Loop throught my array
For element in array -> Open website in new tab -> do my business -> close it

但我找不到任何方法来实现这一点。

这是我正在使用的代码。网站之间需要很长时间,我需要它快速......允许使用其他工具,但我不知道有太多工具用于废弃使用 JavaScript 加载的网站内容(在加载时触发某些事件时创建的 div 等)为什么我需要 Selenium... BeautifulSoup 不能用于我的某些页面。

#!/usr/bin/env python
import multiprocessing, time, pika, json, traceback, logging, sys, os, itertools, urllib, urllib2, cStringIO, mysql.connector, shutil, hashlib, socket, urllib2, re
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from PIL import Image
from os import listdir
from os.path import isfile, join
from bs4 import BeautifulSoup
from pprint import pprint

def getPhantomData(parameters):
    try:
        # We create WebDriver
        browser = webdriver.Firefox()
        # Navigate to URL
        browser.get(parameters['target_url'])
        # Find all links by Selector
        links = browser.find_elements_by_css_selector(parameters['selector'])

        result = []
        for link in links:
            # Extract link attribute and append to our list
            result.append(link.get_attribute(parameters['attribute']))
        browser.close()
        browser.quit()
        return json.dumps({'data': result})
    except Exception, err:
        browser.close()
        browser.quit()
        print err

def callback(ch, method, properties, body):
    parameters = json.loads(body)
    message = getPhantomData(parameters)

    if message['data']:
        ch.basic_ack(delivery_tag=method.delivery_tag)
    else:
        ch.basic_reject(delivery_tag=method.delivery_tag, requeue=True)

def consume():
    credentials = pika.PlainCredentials('invitado', 'invitado')
    rabbit = pika.ConnectionParameters('localhost',5672,'/',credentials)
    connection = pika.BlockingConnection(rabbit)
    channel = connection.channel()

    # Conectamos al canal
    channel.queue_declare(queue='com.stuff.images', durable=True)
    channel.basic_consume(callback,queue='com.stuff.images')

    print ' [*] Waiting for messages. To exit press CTRL^C'
    try:
        channel.start_consuming()
    except KeyboardInterrupt:
        pass

workers = 5
pool = multiprocessing.Pool(processes=workers)
for i in xrange(0, workers):
    pool.apply_async(consume)

try:
    while True:
        continue
except KeyboardInterrupt:
    print ' [*] Exiting...'
    pool.terminate()
    pool.join()

最佳答案

编者注:此答案不再适用于新的 Selenium 版本。引用 this comment .


您可以通过组合键COMMAND + TCOMMAND + W<来实现标签页的打开/关闭/kbd> (OSX)。在其他操作系统上,您可以使用 CONTROL + T/CONTROL + W

在 selenium 中,您可以模拟这种行为。 您将需要创建一个 Web 驱动程序和您需要的测试尽可能多的选项卡。

这是代码。

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()

关于python - 在新标签页中打开网页 Selenium + Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28431765/

相关文章:

python - 递归错误 : maximum recursion depth exceeded - simple program

python - 删除 Numpy 中重新排列的数组

python - 将 qcut 应用于滚动分析

selenium - Cucumber 数据表 - 使用 POJO/PROP 文件

java - org.openqa.selenium.NoSuchSessionException : Session ID is null. 在调用 quit() 后使用 WebDriver?

javascript - 如何修复 iframe 不适用于 Microsoft Edge?

javascript - 登录后保持 session - selenium - javascript

自定义测试命令的 Python setup.py 测试依赖项

java - XPath选择器Selenium WebDriver,无法使用ID

selenium - 如何使用 Selenium WebDriver 检查单选按钮是否被选中?