0

我有一个运行随机视频的 HTML 视频播放器。我有以下功能,可以根据视频观看百分比测试视频是否标记为已完成。VideoCompletionPercentage 是一个全局变量,通过从数据库中读取它来设置。我必须测试以下两个条件:

  1. 如果在数据库中设置了 VideoCompletionPercentage 之前看到视频,则验证视频是否标记为完成。
  2. 验证视频是否被标记为完成,如果它被向前跳过并看到直到 100%

我基于跳过布尔变量在两个 while 循环之间切换。有没有办法通过操纵while条件或任何其他方式将这两个do while循环组合成一个?提前感谢您的投入。

private void VideoPecentageCompletion(bool skip)
        {
            double videoSeenPercentage;
            if (skip)
            {
                do
                {
                    double.TryParse(Driver.FindElement(By.CssSelector("div[class=played]")).GetAttribute("aria-valuemax"), out double totalVideo);
                    double.TryParse(Driver.FindElement(By.CssSelector("div[class=played]")).GetAttribute("aria-valuenow"), out double videoProgress);
                    videoSeenPercentage = Math.Floor(videoProgress / totalVideo * 100);
                } while (videoSeenPercentage < VideoCompletionPercentage);
            }
            else
            {
                do
                {
                    double.TryParse(Driver.FindElement(By.CssSelector("div[class=played]")).GetAttribute("aria-valuemax"), out double totalVideo);
                    double.TryParse(Driver.FindElement(By.CssSelector("div[class=played]")).GetAttribute("aria-valuenow"), out double videoProgress);
                    videoSeenPercentage = Math.Floor(videoProgress / totalVideo * 100);
                } while (videoSeenPercentage < 100);
            }
        }

4

5 回答 5

1

您可以使用&&and||组合条件,因此只使用一个循环:

do
{
    double.TryParse(Driver.FindElement(By.CssSelector("div[class=played]")).GetAttribute("aria-valuemax"), out double totalVideo);
    double.TryParse(Driver.FindElement(By.CssSelector("div[class=played]")).GetAttribute("aria-valuenow"), out double videoProgress);
    videoSeenPercentage = Math.Floor(videoProgress / totalVideo * 100);
} while ((skip && videoSeenPercentage < VideoCompletionPercentage) || (!skip && videoSeenPercentage < 100));
于 2018-10-04T09:52:09.140 回答
1

你可以只使用operator“?”

do
 {
  :
  :
 }while (videoSeenPercentage < (skip ? VideoCompletionPercentage : 100));
于 2018-10-04T09:58:43.413 回答
0

如果 div 是静态的,您可以将其引入局部变量并避免重新计算。使用@Zohar Peled 的答案,它可能看起来像这样:

private void VideoPecentageCompletion(bool skip)
{       
    var playedDiv = Driver.FindElement(By.CssSelector("div[class=played]");
    do
    {
        double.TryParse(playedDiv.GetAttribute("aria-valuemax"), out double totalVideo);
        double.TryParse(playedDiv.GetAttribute("aria-valuenow"), out double videoProgress);
        videoSeenPercentage = Math.Floor(videoProgress / totalVideo * 100);
    } 
    while ((skip && videoSeenPercentage < VideoCompletionPercentage) || (!skip && videoSeenPercentage < 100));  
}
于 2018-10-04T10:20:06.483 回答
0
private void VideoPecentageCompletion(bool skip)
{
    double videoSeenPercentage;
    double percentage;

    do
    {
        TryGetAttributeValue("aria-valuemax", out double totalVideo);
        TryGetAttributeValue("aria-valuenow", out double videoProgress);
        videoSeenPercentage = Math.Floor(videoProgress / totalVideo * 100);

        percentage = skip ? VideoCompletionPercentage : 100;
    } while (videoSeenPercentage < percentage);
}

private bool TryGetAttributeValue(string attributeName, out double value)
{
    string attributeValue = Driver.FindElement(By.CssSelector("div[class=played]")).GetAttribute(attributeName);
    return double.TryParse(attributeValue, out value);
}
于 2018-10-04T10:42:26.607 回答
0

感谢大家的反馈和建议,特别感谢 Roni 和 Frenchy。

我最终优化、重构和测试的代码如下:

 private void VideoPecentageCompletion(bool skipForward)
    {
        double videoSeenPercentage;
        var playedDiv = Driver.FindElement(By.CssSelector("div[class=played]"));

        do
        {
            double.TryParse(playedDiv.GetAttribute("aria-valuemax"), out double totalVideo);
            double.TryParse(playedDiv.GetAttribute("aria-valuenow"), out double videoProgress);
            videoSeenPercentage = skipForward ? Math.Ceiling(videoProgress / totalVideo * 100) : Math.Floor(videoProgress / totalVideo * 100);
        } while (videoSeenPercentage < (skipForward ? 100 : VideoCompletionPercentage));
    }
于 2018-10-05T06:47:15.370 回答