C# OpenQA.Selenium.WebDriverException:未知错误:a.tagName.toUpperCase不是通过Selenium和C包含reactJS元素的函数#

C# OpenQA.Selenium.WebDriverException:未知错误:a.tagName.toUpperCase不是通过Selenium和C包含reactJS元素的函数#,c#,reactjs,selenium,selenium-webdriver,webdriverwait,C#,Reactjs,Selenium,Selenium Webdriver,Webdriverwait,我有一个问题一直困扰着我,我有一个方法可以查找并检查所有元素是否都在一个页面上,该方法的一部分检查页面元素是否已启用 if (Driver.Instance.FindElement(identifier).Enabled == false) { // do some stuff } 但是,If语句失败,出现以下错误: StackTrace:at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response

我有一个问题一直困扰着我,我有一个方法可以查找并检查所有元素是否都在一个页面上,该方法的一部分检查页面元素是否已启用

if (Driver.Instance.FindElement(identifier).Enabled == false)
 {
    // do some stuff
 }
但是,If语句失败,出现以下错误:

StackTrace:at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
at OpenQA.Selenium.Remote.RemoteWebElement.Execute(String commandToExecute, Dictionary`2 parameters)
at OpenQA.Selenium.Remote.RemoteWebElement.get_Enabled()
...
OpenQA.Selenium.WebDriverException : unknown error: a.tagName.toUpperCase is not a function
(Session info: chrome=71.0.3578.98)
(Driver info: chromedriver=2.45.615291 (ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387),platform=Windows NT 10.0.17134 x86_64)
该方法经常被调用,并在类似情况下与许多其他测试用例一起工作,没有问题,但是,当尝试与以下元素交互时,我得到上面显示的错误:

<div class="sc-gGBfsJ lhiRYE" span="5">
   <svg aria-hidden="true" data-prefix="fas" data-icon="times" class="svg-inline--fa fa-times fa-w-11 sc-jnlKLf dmaYnw" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512" name="tag-create-modal__dismiss-cross">
  <path fill="currentColor" d="M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"></path>
   </svg>
   <div class="sc-hdPSEv kfkXT" id="CreateTagPropSheet__container" name="undefined__container">
  <div class="sc-nrwXf egtFZS">
     <div class="sc-fKGOjr bfXSai sc-ekkqgF dATqpE">
        <h3 class="sc-cpHetk bdaBtw sc-crNyjn fXZflb" id="propertySheet__heading--undefined" name="propertySheet__heading--undefined">Create Tag</h3>
     </div>
  </div>
  <form name="create-Tag__form">
     <div class="sc-nrwXf egtFZS">
        <div class="sc-fKGOjr bfXSai sc-ekkqgF dATqpE">
           <div class="sc-hycgNl KoKFR"><label class="sc-jvEmr jErbdW sc-iBmynh kxfLCa">Tag Name</label></div>
           <div class="sc-chAAoq GJbAH" id="propertySheet__select--tagNameContainer" name="tagNameContainer">
              <div class="sc-dTLGrV dLLsoX"><input class="sc-ivVeuv fMqabh" color="normal" id="propertySheet__select--tagName" name="tagName" type="text" autocomplete="on" value=""></div>
           </div>
        </div>
     </div>
     <div class="sc-nrwXf egtFZS">
        <div class="sc-fKGOjr bfXSai sc-ekkqgF dATqpE">
           <div class="sc-hycgNl KoKFR"><label class="sc-jvEmr jErbdW sc-iBmynh kxfLCa">System Level Tag</label></div>
           <div class="sc-chPdSV Ekqp" id="isSystemLevelCheckContainer" name="isSystemLevelTagContainer">
              <input class="sc-kgoBCf fZucFc" type="checkbox" id="isSystemLevelCheck" name="isSystemLevelTag">
              <div class="sc-kGXeez clAVjW"></div>
           </div>
        </div>
     </div>
     <div class="sc-nrwXf egtFZS">
        <div class="sc-fKGOjr bfXSai sc-ekkqgF dATqpE"><button class="sc-bhlBdH gEVPJV" id="propertySheet__button--create-tag__Button" name="create-tag__Button" color="success">Create Tag</button></div>
     </div>
  </form>
   </div>
</div>

创建标签
标签名
系统级标签
创建标签
我想知道它是否与元素本身有关,上面的代码是使用react构建的网站的一个片段,其中这些元素是有条件呈现的

是否有人对引起此问题的原因有任何想法,我们将不胜感激……

Element.tagName 根据
元素的
标记名
只读属性,接口返回调用该元素的元素的标记名。例如,如果元素是一个
,则其
标记名
属性是
“IMG”
(对于HTML文档;对于XML/XHTML文档,其大小写可能不同)

  • 语法:

    elementName = Element.tagName;
    
  • Value:一个字符串,指示元素的标记名。此字符串的大小写取决于文档类型:

    • 对于表示HTML文档的DOM树,返回的标记名始终采用规范的大写形式。例如,对
      元素调用的
      标记名
      返回
      “DIV”
    • XML DOM树中元素的标记名返回的情况与它们写入原始XML文件的情况相同。如果XML文档包含标记“”,则标记名属性的值为“SomeTag”
此外,根据:

注意,这在XML中是保留大小写的,DOM的所有操作也是如此。HTML DOM以规范大写形式返回HTML元素的标记名,而不考虑源HTML文档中的大小写

解决方案 正如您所提到的,代码是一个使用react so的片段,在检查元素是否已启用之前,请按如下所示导入WebDriverWait以查看所需元素的可见性:

if (Driver.Instance.FindElement(identifier).Enabled == false)
if (new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementIsVisible(By.XPath("element_xpath"))).Enabled == false)
 {
    // do some stuff
 }
元素标记名 根据
元素的
标记名
只读属性,接口返回调用该元素的元素的标记名。例如,如果元素是一个
,则其
标记名
属性是
“IMG”
(对于HTML文档;对于XML/XHTML文档,其大小写可能不同)

  • 语法:

    elementName = Element.tagName;
    
  • Value:一个字符串,指示元素的标记名。此字符串的大小写取决于文档类型:

    • 对于表示HTML文档的DOM树,返回的标记名始终采用规范的大写形式。例如,对
      元素调用的
      标记名
      返回
      “DIV”
    • XML DOM树中元素的标记名返回的情况与它们写入原始XML文件的情况相同。如果XML文档包含标记“”,则标记名属性的值为“SomeTag”
此外,根据:

注意,这在XML中是保留大小写的,DOM的所有操作也是如此。HTML DOM以规范大写形式返回HTML元素的标记名,而不考虑源HTML文档中的大小写

解决方案 正如您所提到的,代码是一个使用react so的片段,在检查元素是否已启用之前,请按如下所示导入WebDriverWait以查看所需元素的可见性:

if (Driver.Instance.FindElement(identifier).Enabled == false)
if (new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementIsVisible(By.XPath("element_xpath"))).Enabled == false)
 {
    // do some stuff
 }

我也有同样的问题,在挖掘了一段时间后,我注意到同一页上还有一些其他元素,我甚至没有与had attribute name=“tagname”进行交互。当我将它更改为tagname2时,我不再有这个错误,并且我能够正确地与目标元素交互


令人惊讶的是,我在Chrome 81.0.4044.20上遇到了这个问题,而在80.x上没有遇到这个问题。我也遇到了同样的问题,在挖掘了一段时间后,我注意到在同一页面上还有一些其他元素,我甚至没有与had attribute name=“tagname”交互。当我将它更改为tagname2时,我不再有这个错误,并且我能够正确地与目标元素交互


令人惊讶的是,我在Chrome 81.0.4044.20上遇到了这个问题,而在80.x上没有遇到这个问题

定位器使用了什么?i、 identifier?所以这个方法被调用了很多次,我通常通过一个函数来检查一个交互元素,例如name=“tagName”。我保存了一个包含我感兴趣的许多页面元素的私有静态库——它们遵循这个原则——私有静态按标记名文本字段=By.Name(“标记名”);——-这些只是在方法之间传递,例如-----------public static Boolean FindElement(按标识符)定位器使用了什么?i、 identifier?所以这个方法被调用了很多次,我通常通过一个函数来检查一个交互元素,例如name=“tagName”。我保存了一个包含我感兴趣的许多页面元素的私有静态库——它们遵循这个原则——私有静态按标记名文本字段=By.Name(“标记名”);——-这些只是在方法之间传递,例如-----------public static Boolean FindElement(按标识符)感谢您的深入解释,它非常有用-但是正如我提到的,这是一个片段,我忽略了检查元素是否在页面上。为糟糕的清晰度道歉