当前位置: 首页 > 面试题库 >

在新标签页中打开Web Selenium + Python

上官自明
2023-03-14
问题内容

因此,我试图在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创建的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()

问题答案:

你可以通过组合键COMMAND+ TCOMMAND+ 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()


 类似资料:
  • 问题内容: 我想使用Javascript在其他标签中打开新页面,但仍将重点放在当前标签上。我知道我可以这样做: 但是,当我在chrome中执行此操作时,它会闪烁新标签一会儿,然后再切换回当前标签。我想避免这种情况。 该应用程序是个人书签,因此仅需在最新的Chrome中运行。 问题答案: 更新:谷歌浏览器的版本41 似乎已更改行为。 这可以通过在属性属性设置为所需的动态生成元素上模拟+ (或打开背景

  • 问题内容: 我有以下使用Vaadin编写的代码。当用户单击按钮时,代码将打开页面。 我的问题是我有什么办法指定要在新标签页中打开页面吗? 谢谢。 问题答案: 该窗口的名字是很重要的位置。要注意的是,你还可以有一个浏览器 将 可以在新窗口中打开资源来代替。 该方法还有另一个签名,即 可能符合要求。HTH。 参考:Page(Vaadin 7.2.1 API) 。

  • 问题内容: 在chrome中,这会在新标签页中打开: 这会在新窗口中打开(但我也想在新标签页中打开它: 这可行吗? 问题答案: 您不能直接控制它,因为它是由Internet Explorer用户控制的选项。 使用Window.open使用不同的窗口名称打开页面将在新的浏览器窗口(如弹出窗口)中打开,或者在用户配置的浏览器中打开。 编辑: 更详细的解释: 1. 在现代浏览器中,window.open

  • 问题内容: 自从将近一个月以来,我一直在使用CasperJS测试框架来制作一些测试套件,但是其中之一面临着一个问题。 这是我要执行的操作:我正在浏览一个url(第1页),并且必须从另一个url(像在图形浏览器中那样模拟新选项卡)执行另一个操作,而不必退出第一个(第1页)。来自第二个URL的操作将更改我的第一个URL。希望它足够清楚:) 因此,现在,当我到达观察第一个URL的步骤时,我通过执行操作打

  • 问题内容: 我希望能够在Selenium 2中的新选项卡中打开链接。我也想在与页面完成交互后关闭该选项卡。这怎么可能,如果我有一个的标签? 我将Selenium 2的Java API与运行在Firefox 4上的Firefox驱动程序结合使用。 问题答案: 目前,Selenium WebDriver API没有任何处理选项卡的方法。在我希望看到一种语言绑定(例如Java)的实现之前,该项目确实需要

  • 问题内容: 是否可以在新标签页而不是同一标签页中打开链接? 问题答案: 您应该在锚标记中添加和。 例如: 添加不是强制性的,但这是建议的安全措施。可以在下面的链接中找到更多信息。