【问题标题】:Bug with selenium java & chromedriver 77 on element.getAttribute('id')?element.getAttribute('id') 上的 selenium java 和 chromedriver 77 的错误?
【发布时间】:2019-09-25 11:41:14
【问题描述】:

自 Google Chrome 77 发布以来,我更新了我们的 CI 流程,以便完成无头自动化测试:

一个完美运行的简单代码已经不行了,因为element.getAttribute('id')返回null而不是HTML元素的id属性的字符串值(已经找到使用 By.id() !)

我在 Windows 和 Linux (docker) 上尝试过这样的配置,结果是一样的:getAttribute('id') 返回 null 而不是 HTML 元素 id

重现问题的简化代码:

String myId = "myInputTypeDateId" ;
WebElement element = (new WebDriverWait(driver, timeout)).until(ExpectedConditions.presenceOfElementLocated(By.id(id)));
String eltId = element.getAttribute("id");
// With chrome 76 & chromedriver 76: returns "myInputTypeDateId"
// With chrome 77 & chromedriver 77: returns null

附加信息:

  • 与问题相关的元素是<input type = "date">
  • 我正在使用 Aura 组件框架 (Salesforce 闪电)

是否有人检测到 Chrome/Chromedriver 77 存在类似问题?

关于一些解决方法的任何建议?

【问题讨论】:

    标签: selenium selenium-webdriver selenium-chromedriver webdriverwait google-chrome-headless


    【解决方案1】:

    似乎是chromedriver和Salesforce之间的兼容性问题

    它已在 chromedriver 78 中解决,但使其与 Chrome 77 一起使用的唯一方法似乎是将 chromedriver 76 与 chrome 77 一起使用

    我们是几个用户,要求提供 chromedriver 77 补丁,但尚未提供

    更多详情:https://bugs.chromium.org/p/chromedriver/issues/detail?id=3103#c6

    【讨论】:

      【解决方案2】:

      要在尝试从 <input> 元素调用 getAttribute() 时提取 id 属性,而不是使用 presenceOfElementLocated(),您需要诱导 WebDriverWait对于visibility_of_element_located()element_to_be_clickable(),您可以使用以下任一Locator Strategies

      • 使用visibilityOfElementLocated()

        System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.id("myInputTypeDateId"))).getAttribute("id"));
        
      • 使用elementToBeClickable()

        System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.id("myInputTypeDateId"))).getAttribute("id"));
        

      您可以在Java Wrapper method for waiting for element to be available for Apache Cordova Webview driven App找到详细讨论

      【讨论】:

      • 如果由presenceOfElementLocated 返回,则该HTML 元素存在于DOM 中。为什么必须强制可见或可点击才能获得它的 id 属性?
      • @NicolasVuillamy presenceOfElementLocated 不保证元素在 HTML 中是可见的可交互的。因此,在您的用例中等待visibilityOfElementLocated 将是最佳选择。然而,作为一个<input> 元素,它会在额外的时间跨度内变为可点击
      • 有时我必须强制滚动以使元素可见和可点击,这就是我需要使用“当前”检查的原因。但正如我的回复中所述,这是一个 chromedriver 错误......感谢您的回答!
      • @NicolasVuillamy elementToBeClickable 默认会在点击之前滚动元素。但是我提供了一个参考讨论。如果有帮助,请告诉我。
      猜你喜欢
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多