不确定标题应该是什么,请随时编辑。 我是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。
答案 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的速度最快。