0

我正在尝试从Youtube. 我会尝试在不分享我所有的课程的情况下让事情变得简单,但仍会向您展示我正在使用的元素。

IwebDriver  _webdriver = new ChromeDriver();
_webdriver.Navigate().GoToUrl("https://www.youtube.com/");
var element = wait.Until(x => x.FindElement(By.Id("search")));
element.SendKeys("Perfect");
var element = wait.Until(x => x.FindElement(By.CssSelector("#search-icon-legacy>yt-icon")));
element.Click();
var content = wait.Until(x => x.FindElement(By.Id("contents")));
var songHREF = content.FindElements(By.CssSelector("#video-title"));
songHREF[2].Click();

因此,发生的主要事情是 90% 的运行,songHREF将点击实际位于主页上的对象(歌曲链接),而不是“结果”页面。剩下的 10% 只是失败了。它没有找到songHREF元素(元素不可见)。

4

2 回答 2

0

根据您的问题,一旦您将字符序列(例如Perfect)发送到搜索字段并启动搜索,您可以创建所有歌曲的列表,然后根据您的选择,例如包含标题中文本歌词Click()的歌曲,您可以在其上调用您可以使用以下解决方案:

IwebDriver  _webdriver = new ChromeDriver();
_webdriver.Navigate().GoToUrl("https://www.youtube.com/");
new WebDriverWait(_webdriver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("input#search"))).SendKeys("Perfect");
_webdriver.FindElement(By.CssSelector("button.style-scope.ytd-searchbox>yt-icon")).Click();
IList<IWebElement> contents = new WebDriverWait(_webdriver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(By.CssSelector("h3.title-and-badge.style-scope.ytd-video-renderer a")));
foreach (IWebElement content in contents)
    if(content.GetAttribute("innerHTML").Contains("Lyrics"))
    {
        content.Click();
        break; 
    }
于 2018-07-19T17:11:34.757 回答
0

尝试等到元素可以点击:

var wait = new WebDriverWait(driver, TimeSpan.FromMinutes(1));
wait.Until(ExpectedConditions.ElementIsClickable(songHREF[2]));
songHREF[2].Click()

这将等待至少 1 分钟,直到元素可以点击,然后才点击它。

完整的代码是这样的:

IwebDriver  _webdriver = new ChromeDriver();
_webdriver.Navigate().GoToUrl("https://www.youtube.com/");
var element = wait.Until(x => x.FindElement(By.Id("search")));
element.SendKeys("Perfect");
var element = wait.Until(x => x.FindElement(By.CssSelector("#search-icon- 
legacy>yt-icon")));
element.Click();
// refresh the page
Driver.Instance.Navigate().Refresh();
var content = wait.Until(x => x.FindElement(By.Id("contents")));
var songHREF = content.FindElements(By.CssSelector("#video-title"));
var wait2 = new WebDriverWait(driver, TimeSpan.FromMinutes(1));
wait2.Until(ExpectedConditions.ElementIsClickable(songHREF[2]));
songHREF[2].Click();

我已经抓住了这个问题。有时定位器在定位不可见元素时会出错,但只需刷新页面将有助于修复它。注意:在找到上面代码片段中的元素之前刷新页面。

搜索元素时的正常结果:

图像

有时使用相同的定位器会得到这个结果:

img2

在这种情况下,前 25 个元素是不可见的。但是刷新页面后,结果就像第一种情况一样(如预期的那样)。

于 2018-07-19T10:29:34.933 回答