C#Selenium CSS选择器属性不起作用

时间:2019-04-04 11:06:23

标签: c# selenium

我正在尝试运行Selenium测试,它等待直到某个属性具有继续的值,并在浏览器中检查时(代码检查Ctrl + shit + I,ctrl + F),它使用css定位器,但是在运行测试时,我总是会超时-该元素在该时间之前会获得所需的值

  1. 已检查css定位符在“检查代码”中是否有效并进行搜索
  2. 尝试了更简单的定位器-它可以找到ID,但无法找到属性及其值
  3. 疯狂地谷歌搜索找到解决方案

我的代码(CMExtensionMethods.IsElementVisible == ExpectedConditions,执行相同的操作):

public static WebDriverWait waitForElement = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
waitForElement.Until(CMExtensionMethods.IsElementVisible(By.CssSelector("#page_progress[style~='display:']")));


public static Func<IWebDriver, IWebElement> IsElementVisible(By identifier) {
           return (driver) =>
           {
               try {
                   return IfElementVisible(driver.FindElement(identifier));
               }
               catch(NoSuchElementException) {
                   return null;
               }
           };
       }
       // Part of the method above
       private static IWebElement IfElementVisible(IWebElement element) {
           return element.Displayed ? element : null;
       }

页面上的HTML代码(page_progress样式随网站状态而异-样式为此样式或为空):

    <div id="page_progress" class="loading-progress" style="display: none;"> 
    </div>
    <div id="page_saveindicator" class="unsaved-changes" style="display: 
     none;"></div>

期望:样式获得值后立即继续执行的代码

结果:什么都没找到,尽管设置了元素的属性和值,但在5秒(设置)后出现了超时错误

也许值得一提-方法 IsElementVisible 可以工作-在ID和CSSselector上使用类和ID(单独)进行了测试

2 个答案:

答案 0 :(得分:0)

在CSS选择器中使用了错误的比较运算符。

~=运算符必须与属性值完全匹配。

要么添加属性值的block部分,要么将比较运算符更改为^=

By.CssSelector("#page_progress[style^='display:']")

更多信息:https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors

答案 1 :(得分:0)

您不需要(也不应该)在定位器中包含style=display:...来确定可见性。当您使用.Displayed或使用ExpectedConditions并等待可见时,Selenium会为您完成。只需正常定位该元素,例如您的两个元素都有ID,因此请使用By.Id("page_progress"),例如

wait.Until(ExpectedConditions.ElementIsVisible(By.Id("page_progress"));

而硒将负责其余的工作。