使用Selenium(Python)打开多个URL

时间:2016-05-28 00:14:49

标签: python selenium browser-automation

Windows 10 x64 / Python 2.7 / Selenium

我正在尝试构建一个工具来抓取我的票证队列以获取未分配的票证,打开它们并查找关键字,然后执行其他操作。但就目前而言,我似乎无法弄清楚代码是否比第一个URL打开更多。我一直收到 StaleElementReferenceException 错误;我不明白为什么。

我建立在我发现的例子之上。这甚至可能不是一个很好的方法来解决这个问题。我也愿意接受新的方向。

这样做的目标是每隔X就有一些东西刮掉队列,当找到某些关键字时,我会提示分配它。它在我做其他任务时需要独立运行,因此它不会干扰我的击键。

from selenium import webdriver
import selenium.webdriver.support.ui as ui
from selenium.webdriver.common.keys import Keys
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
import unittest

class LoginTest (unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.get("https://TICKETS.COMPANY.COM/TEAM/MINE")

    def test_Login(self):
        driver = self.driver
        table = "UNASSIGNED-TICKETS"

        # Select the UNASSIGNED-TICKETS tab
        selectUnassignedTab = WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_link_text('Unassigned'))
        selectUnassignedTab.click()

        # Grab all of the Ticket URLs
        unlockedTickets = WebDriverWait(driver, 10).until(lambda driver: driver.find_elements_by_xpath("//table[@id='unlocked-tickets']/tbody/tr[@role='row']/td[@class='nowrap']/a[@href]"))


        counter = 1
        dictURLs={}
        for ticket in unlockedTickets:
            ticketUrl = ticket.get_attribute('href')
            # Troubleshooting: Make sure URLs are grabbed.
            print ticket.get_attribute('href')

            # Stuff them in a dict
            dictURLs["string{0}".format(counter)]=ticketUrl


            # Open each ticket (NOT WORKING)
            # driver.get(ticketUrl) <--- Causes the Stale Element Error

            if counter == 1:
                # Wait for the User and Pass fields to load. Then assign them.
                emailFieldElement = WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_name('username'))
                passFieldElement = WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_name('password'))

                # Log in information.
                emailFieldElement.clear()
                emailFieldElement.send_keys("USERNAME-HERE")
                passFieldElement.clear()
                passFieldElement.send_keys("PASSWORD-HERE")
                passFieldElement.submit()

            counter = counter + 1

    def tearDown(self):
        sleep(15)
        self.driver.quit()

if __name__ == '__main__':
    unittest.main()

1 个答案:

答案 0 :(得分:0)

我使用此代码打开了多个窗口,它的工作就像一个魅力

from selenium import webdriver
import threading
import time


def test_logic():
    driver = webdriver.Firefox()
    url = 'https://www.google.co.in'
    driver.get(url)
    # Implement your test logic
    time.sleep(2)
    driver.quit()

N = 5   # Number of browsers to spawn
thread_list = list()

# Start test
for i in range(N):
    t = threading.Thread(name='Test {}'.format(i), target=test_logic)
    t.start()
    time.sleep(1)
    print t.name + ' started!'
    thread_list.append(t)

# Wait for all thre<ads to complete
for thread in thread_list:
    thread.join()

print 'Test completed!'