C# C Selenium CSS选择器属性不工作

C# C Selenium CSS选择器属性不工作,c#,selenium,C#,Selenium,我正在尝试运行Selenium测试,它会一直等到某个属性有一个值要继续,当在浏览器代码检查中检查Ctrl+shift+I,Ctrl+F时,它会使用css定位器定位元素,但在运行测试时,我总是得到一个超时,并且元素在该时间之前获得所需的值 检查css定位器在检查代码和搜索中是否有效 尝试了更简单的定位器-它定位id,但无法定位属性及其值 疯狂地搜索以找到解决方案 我的代码CMExtensionMethods.IsElementVisible==ExpectedConditions执行相同的操作:

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

检查css定位器在检查代码和搜索中是否有效 尝试了更简单的定位器-它定位id,但无法定位属性及其值 疯狂地搜索以找到解决方案 我的代码CMExtensionMethods.IsElementVisible==ExpectedConditions执行相同的操作:

页面上的HTML代码\u进度样式根据网站状态而变化-样式如下或为空:

期望:代码在样式获得值后立即继续

结果:找不到任何内容,设置为5秒后,我得到一个超时错误,尽管元素具有属性和它应该具有的值


可能值得一提的是-该方法IsElementVisible可以工作-在Id上进行测试,CSS选择器仅使用Class和Id

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

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

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


更多信息:

您不需要也不应该包括style=display:。。。在定位器中确定可见性。Selenium在您使用.displated或使用ExpectedConditions并等待visible时为您做到这一点。只需正常定位元素,例如,您的两个元素都有一个ID,因此使用By.Idpage\u progress,如


根据W3School的说法,~=不代表确切的值,也不代表其他值,而是代表所有含有该值的东西。正如我提到的,它在浏览器中工作,所以硒元素应该没有区别,对吗?我还没想到,等我回到我的代码后,我就得试一下,然后我会发布结果。这帮我解决了问题……不知怎的,我希望在页面上可以看到,即使没有显示,谢谢
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;
       }

    <div id="page_progress" class="loading-progress" style="display: none;"> 
    </div>
    <div id="page_saveindicator" class="unsaved-changes" style="display: 
     none;"></div>
By.CssSelector("#page_progress[style^='display:']")
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("page_progress"));