Selenium任务变得越来越慢

时间:2016-06-30 20:21:02

标签: python selenium automation

不确定标题应该是什么,请随时编辑。 我是Selenium的新手,只是玩弄它。 我尝试在我最喜欢的网站(10fastfingers.com)上进行实验,我常常用它来练习打字。 我尝试使用Selenium和Python(3.5。*)的最新版本自动输入。自动化工作正常,但真的很慢。

这是我的示例脚本,我不知道它为什么会变慢。 很高兴有人会帮助我。我期待脚本超过100 WPM,但它只达到 37 WPM

问题是,只有两行单词是可见的,因此,它不会同时显示所有单词,这些单词会一直显示,因为您一直在键入它们。所以,我无法立即接受所有单词,并将其存储在列表中,然后稍后循环遍历它们。

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

driver = webdriver.Firefox()
driver.get("http://10fastfingers.com/typing-test/english")
input = driver.find_element_by_id("inputfield")
for i in range(300):
    word = driver.find_element_by_class_name("highlight")
    word = word.text
    print("Typing word ", word)
    input.send_keys(word)
    input.send_keys(Keys.SPACE)

更新

我尝试获取之前的所有字词,而不是按照@ alecxec的建议在循环中使用find_element_*。为此,我必须使用BeautifulSoup来解析HTML,因为它是String格式,我不能使用任何find_element_*函数。以下脚本将打字速度提高到 138 WPM 。但是,我注意到打字的前20秒真的很快,然后速度开始逐渐下降。请随意在您的机器上试用该脚本,并让我知道该脚本在您的系统上实现的测试结果(WPM)。也许这取决于系统配置。我不知道。这是一些内存问题吗?或代码问题?知道如何解决这个问题。

修改后的代码

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
driver = webdriver.Firefox()
driver.get("http://10fastfingers.com/typing-test/english")
input = driver.find_element_by_id("inputfield")

script = "return document.getElementById('row1').innerHTML"
all_words= driver.execute_script(script)
soup = BeautifulSoup(all_words, 'html.parser')
words = soup.find_all('span')
for word in words:
    text = word.text
    input.send_keys(text + Keys.SPACE)

更新2

重启了我的系统,并关闭了所有其他应用程序,脚本像魔术一样运行,在计时器达到60秒之前输入了所有361个可用单词,结果是 361 WPM 即可。因此,这取决于可用的RAM。

2 个答案:

答案 0 :(得分:3)

每个.find_element_*.text.send_keys()等调用都是WebDriver命令,涉及HTTP请求/响应(请参阅JSON wire protocol)处理。您可以通过在循环之前获取word值来显着减少发送的WebDriver命令的数量:

word = driver.find_element_by_class_name("highlight").text
for i in range(300):
    print("Typing word ", word)
    input.send_keys(word + Keys.SPACE)

我也加入了send_keys()一个电话。

请注意,有一种更好的方法来处理这个特定的用例。所有的单词实际上都在HTML中,你只需要得到它们。 .text只会返回一个可见文字,而是使用get_attribute("textContent")

input_elm = driver.find_element_by_id("inputfield")

words_to_type = [word.get_attribute("textContent") + Keys.SPACE 
                 for word in driver.find_elements_by_css_selector("#row1 > span")]
for word in words_to_type:
    input_elm.send_keys(word)

或者,怎么样?使用Action Chains - 事先准备好动作,然后执行(我的机器每分钟360字):

from selenium.webdriver import ActionChains

input_elm = driver.find_element_by_id("inputfield")

actions = ActionChains(driver)
actions = actions.move_to_element(input_elm).click()
for word in driver.find_elements_by_css_selector("#row1 > span"):
    actions = actions.send_keys(word.get_attribute("textContent") + Keys.SPACE)
actions.perform()

答案 1 :(得分:1)

我喜欢这样的东西。我首先用Java做了我的。

while (true)
{
    String word = driver.findElement(By.cssSelector("span.highlight")).getText();
    driver.findElement(By.id("inputfield")).sendKeys(word + " ");
}

这让我得到了每分钟361分钟,但我注意到我的中途用尽了一半。我的第二次尝试要快得多,但速度太快了。所有的话都错了。

List<WebElement> words = driver.findElements(By.cssSelector("span[wordnr]"));
WebElement input = driver.findElement(By.id("inputfield"));
System.out.println(words.size());
for (WebElement word : words)
{
    input.sendKeys(word + " ");
}

我意识到我的第一次尝试是使用highlight,这意味着它只会跟注册成功输入的页面一样快(从而触发highlight类更改)。我认为由于页面的缓慢(相对),~360的速度最快。