目的是在事件click
之前使用Selenium更改HTML视频的播放速率。关于请求的讨论有多个线程,例如OP1或OP2。
从OP1,Jeremy Visser建议直接更改属性(不确定我的理解是否正确,如下)
document.querySelector('video').defaultPlaybackRate = 2.0;
虽然手上建议的Armel如下面的代码片段所示(我相信这是某种js:如果我错了请指正我]
var vid = document.getElementById("video1");
function fastPlaySpeed() {
vid.playbackRate = 2;}
请注意,这是我第一次尝试将Selenium
与js
注入一起使用。所以,我的问题的方向可能是错误的。
所以,我的问题是,如果我们要使用Jeremy Visser或Armel的方法,那么在下面的代码中,应该放置建议的语法吗?
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
chrome_options = webdriver.ChromeOptions()
browser = webdriver.Chrome(executable_path=r"\Browsers\chromedriver.exe",
options=chrome_options)
browser.get("https://www.youtube.com/watch?v=nXbfZL5kttM")
WebDriverWait(browser, 70).until(EC.element_to_be_clickable(
(By.XPATH, "//button[@aria-label='Play']"))).click()
print('Complete play')
## Should put the java script here or should it exist on its own file?
## or maybe the attribute editor here?
虽然我已经阅读了一些有关使用硒进行js注入的tutorial,但是我的知识仍然很有限,特别是在申请这种特殊情况时。
感谢您花费时间接受此请求。
编辑3:
此OP4建议在iframe上使用postMessage来传递setPlaybackRate命令,并在参数中添加rate。但是,问题仍然在哪里呢?
var playbackRate = 2;
var data = {event: 'command', func: 'setPlaybackRate', args: [playbackRate, true]};
var message = JSON.stringify(data);
$('#iframe1')[0].contentWindow.postMessage(message, '*');
编辑2:
显然,YouTube具有特定功能:player.setPlaybackRate(suggestedRate:Number):Void
为此。此功能为当前视频iFrame API设置建议的播放速率。
编辑1:
我的理解由格雷格·伯格哈特(Greg Burghardt)评论
WebDriverWait(browser, 70).until(EC.element_to_be_clickable(
(By.XPATH, "//button[@aria-label='Play']"))).click()
print('Complete play')
JavascriptExecutor js;
js = (JavascriptExecutor)driver;
js.executeScript("vid.playbackRate = 2;");
目的是在使用Selenium单击事件之前更改HTML视频的播放速率。关于请求的讨论有多个线程,例如OP1或OP2。在OP1中,Jeremy Visser ...
在Web驱动程序对象上调用execute_script: