Selenium是慢的还是我的代码错了?

时间:2013-07-04 05:59:42

标签: python selenium http selenium-webdriver ui-automation

所以我尝试使用Python登录Quora,然后抓一些东西。

我正在使用Selenium登录该网站。这是我的代码:

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

driver = webdriver.Firefox()
driver.get('http://www.quora.com/')

username = driver.find_element_by_name('email')
password = driver.find_element_by_name('password')

username.send_keys('email')
password.send_keys('password')
password.send_keys(Keys.RETURN)

driver.close()

现在问题:

  1. 找到并填写登录表单需要大约4分钟,这种情况非常缓慢。我能做些什么来加快这个过程吗?

  2. 登录时,如何确保没有错误?换句话说,我如何检查响应代码?

  3. 如何使用selenium保存Cookie,以便我可以在登录后继续抓取?

  4. 如果没有办法让硒更快,还有其他办法登录吗? (Quora没有API)

6 个答案:

答案 0 :(得分:9)

我在使用ChromeDriver的Python selenium中调用非常慢的find_elements_xxx时遇到了类似的问题。我最终找到了我在find_element_xxx()调用之前调用的driver.implicitly_wait()调用的麻烦;当我拿出它时,我的find_element_xxx()调用很快就会运行。

现在,当我执行find_elements_xxx()调用时,我知道那些元素。所以我无法想象为什么implicit_wait应该影响这些操作的速度,但确实如此。

答案 1 :(得分:3)

  1. 我去过那里,硒很慢。填写表格可能不会慢到4分钟。然后我开始使用phantomjs,它比firefox快得多,因为它是无头的。在安装最新的phantomjs之后,您可以在webdriver行中使用PhantomJS()替换Firefox()。

  2. 要检查您是否已登录,您可以断言登录后显示的某些元素。

  3. 只要您不退出驱动程序,就可以使用Cookie来关注链接

  4. 您可以尝试使用urllib并直接发布到登录链接。您可以使用cookiejar来保存cookie。你甚至可以简单地保存cookie,毕竟,cookie只是http标题中的一个字符串

答案 2 :(得分:2)

您可以使用自己的setAttribute方法来固定表单填充,这里是java的代码

public void setAttribute(By locator, String attribute, String value) {
    ((JavascriptExecutor) getDriver()).executeScript("arguments[0].setAttribute('" + attribute
            + "',arguments[1]);",
            getElement(locator),
            value);
}

答案 3 :(得分:0)

对于使用Python Selenium的Windows 7和IEDRIVER,结束Windows命令行并重新启动它可以解决我的问题。

我遇到了find_element..clicks的问题。他们花了30秒加一点点。这是我所拥有的代码类型,包括捕获运行时间。

timeStamp = time.time()
elem = driver.find_element_by_css_selector(clickDown).click()
print("1 took:",time.time() - timeStamp)

timeStamp = time.time()
elem = driver.find_element_by_id("cSelect32").click()
print("2 took:",time.time() - timeStamp)

每次点击录制约31秒。在结束命令行并重新启动它(它确实结束任何IEDRIVERSERVER.exe进程)后,每次单击为1秒。

答案 4 :(得分:0)

无头运行Web驱动程序应在一定程度上提高其执行速度。

from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options

options = Options()
options.add_argument('-headless')
browser = webdriver.Firefox(firefox_options=options)

browser.get('https://google.com/')
browser.close()

答案 5 :(得分:0)

我更改了定位器,此方法运行很快。另外,我还添加了使用cookie的功能。检查以下代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
import pickle


driver = webdriver.Firefox()
driver.get('http://www.quora.com/')
wait = WebDriverWait(driver, 5)
username = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="login"]//input[@name="email"]')))
password = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="login"]//input[@name="password"]')))

username.send_keys('email')
password.send_keys('password')
password.send_keys(Keys.RETURN)

wait.until(EC.presence_of_element_located((By.XPATH, '//span[text()="Add Question"]'))) # checking that user logged in
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb")) # saving cookies
driver.close()

我们已经保存了cookie,现在我们将它们应用到新的浏览器中:

driver = webdriver.Firefox()
driver.get('http://www.quora.com/')
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    driver.add_cookie(cookie)
driver.get('http://www.quora.com/')

希望,这会有所帮助。