OK、それで、少なくとも私のニーズのために、私はこれをなんとかすることができました。ただし、他のコメントで述べられているように、これでは、要素がエンドユーザーに(画面上に)表示されるかどうかを確認することはできません。
display:none
私が取ったアプローチは、いくつかの基本的なルールをチェックします。要素のスタイル属性にまたはが含まれている場合visibility:hidden
、または祖先要素が同じスタイルルールを持っている場合、要素は「表示されません」 。
それを念頭に置いて、これが私のために仕事をする私のコードです:
private static bool IsNodeVisible(HtmlAgilityPack.HtmlNode node)
{
var attribute = node.Attributes["style"];
bool thisVisible = false;
if (attribute == null || CheckStyleVisibility(attribute.Value))
thisVisible = true;
if (thisVisible && node.ParentNode != null)
return IsNodeVisible(node.ParentNode);
return thisVisible;
}
private static bool CheckStyleVisibility(string style)
{
if (string.IsNullOrWhiteSpace(style))
return true;
var keys = ParseHtmlStyleString(style);
if (keys.Keys.Contains("display"))
{
string display = keys["display"];
if (display != null && display == "none")
return false;
}
if (keys.Keys.Contains("visibility"))
{
string visibility = keys["visibility"];
if (visibility != null && visibility == "hidden")
return false;
}
return true;
}
public static Dictionary<string, string> ParseHtmlStyleString(string style)
{
Dictionary<string, string> result = new Dictionary<string, string>();
style = style.Replace(" ", "").ToLowerInvariant();
string[] settings = style.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string s in settings)
{
if (!s.Contains(':'))
continue;
string[] data = s.Split(':');
result.Add(data[0], data[1]);
}
return result;
}
このためのエントリポイントは、渡されたIsNodeVisible
ものの可視性をチェックします。HtmlNode