【问题标题】:Element not visible -- XPath only finding style [closed]元素不可见——XPath 只查找样式 [关闭]
【发布时间】:2018-12-19 10:25:06
【问题描述】:

我正在尝试使用 XPath 定位器找到以下按钮:

//button[contains(text(), 'Save Request')]

但是,当我这样做时,我收到一个错误:

Element is not Visible

当我尝试使用 Chropath 输入此 XPath 时,它似乎在样式 XPath 属性之后的“1”上突出显示。我该如何解决这个问题?

我尝试添加一个等待直到元素可见,但仍然遇到同样的问题:

public CreatePartRequestModalPage saveRequest() {
    waitForElement(By.xpath(SAVE_REQUEST_XPATH), State.ELEMENT_IS_VISIBLE);
    saveRequest.click();
    return PageFactory.initElements(driver, CreatePartRequestModalPage.class).get();
}

HTML 作为文本:

<button class="btn btn-primary ng-scope" ng-click="ctrl.saveRequest()" ng-if="ctrl.partsList.length > 0" style="" xpath="1">
                Save Request
</button>

【问题讨论】:

  • 我已经尝试过这样做,但我仍然遇到同样的错误
  • 如果应用 ExplicitWait 则不会出现同样的错误
  • 请看上面我添加的代码。我仍然看到同样的问题
  • 你能不能添加 HTML 而不仅仅是图片...

标签: java selenium selenium-webdriver xpath webdriverwait


【解决方案1】:

最好用别的东西然后contains text()

你可以使用//button[@class="btn btn-primary ng-scope"]

希望对你有帮助

【讨论】:

  • 我也尝试过使用这个 xpath 但仍然遇到同样的问题
【解决方案2】:

要找到带有 Save Request 文本的按钮,您可以使用以下基于 xpath 的解决方案:

//button[@class='btn btn-primary ng-scope' and normalize-space()='Save Request']

但由于元素是 Angular 元素到 click() 在元素上,您必须诱导 WebDriverWait 以使 元素可点击,您可以使用以下解决方案:

new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@class='btn btn-primary ng-scope' and normalize-space()='Save Request']"))).click();

【讨论】:

  • 正如您在他尝试使用WebDriverWait 的问题中看到的那样,他将其装扮成waitForElement 我想......我也认为他应该使用不同的XPath......作为我的答案建议...
  • @jamiemca 你试过这个答案吗?
  • 查看@jamiemca 的回答,它实际上是一个错误!我认为他还不能投票...我认为这里的所有答案都很好...这是我的 +1
  • @MosheSlavin 我猜对了 :) 这就是我使用 WebDriverWait 来否定 javascript 效果的原因。
【解决方案3】:

虽然其他答案可能可行,但我想提供另一种方法。 问题不是找到元素,而是在它可见之前与之交互(单击)。一个小的解决方法是通过 JavaScript click 元素。

// Assume driver is a valid WebDriver instance that
// has been properly instantiated elsewhere.
WebElement element = driver.findElement(By.xpath(SAVE_REQUEST_XPATH));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);

这样,Selenium 是否可以点击元素并不重要。希望它有效!

【讨论】:

    【解决方案4】:

    你也可以找到元素

    1. 按 ID

      WebElement element = driver.findElement(By.id("submit"));
      
    2. 按名称

      WebElement element = driver.findElement(By.name("firstname"));
      
    3. 按类名

      WebElement parentElement = driver.findElement(By.className("button"));
      //or
      WebElement childElement = parentElement.findElement(By.id("submit"));
      
    4. 按标签名

      WebElement element = driver.findElement(By.tagName("button"));
      
    5. 通过 XPath

    所以尝试使用上述方法查找元素。

    尝试使用类名获取您的按钮,它会起作用。

    【讨论】:

    • 我相信你的意思很好,但你的答案太宽泛了,例子与问题无关......
    • 我认为每个答案都应该有相关的解释,所以我只是想提供不同的元素查找方法
    【解决方案5】:

    抱歉,事实证明页面上有一个 javascript 错误,并且按钮没有点击。这就是我收到“元素不可见”错误的原因。谢谢大家的帮助!

    【讨论】:

    • 感谢您回复我们!奇怪的是错误是"Element is not Visible"...
    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2018-10-23
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多