【问题标题】:Unable to recognize Element with relative xpath or other locator无法使用相对 xpath 或其他定位器识别元素
【发布时间】:2021-07-21 17:09:15
【问题描述】:

我面临一个问题,即我无法使用任何类型的定位器(期望绝对 xpath)在网页上找到元素。以下是详细信息:

网址:https://semantic-ui.com/modules/dropdown.html#selection

必需元素屏幕截图:

手动创建的 Xpath 屏幕截图(请注意,我可以通过手动创建的 xpath 识别 Web 应用程序中的元素,但相同的 xpath 在 selenium 代码中不起作用

但是相同的 xpath 在 selenium 脚本中不起作用。

请注意,我可以使用绝对 xpath 识别相同的对象 请帮助我了解原因。

代码如下:

public static WebDriver driver;

public static void main(String[] args) {


    driver= new FirefoxDriver();

    driver.manage().window().maximize();


    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    driver.get("https://semantic-ui.com/modules/dropdown.html");

    //Selection
    driver.findElement(By.xpath("//div[@class='ui selection dropdown upward']")).click();
    driver.findElement(By.xpath("//div[@class='menu transition visible']/div[text()='Female']")).click();

    System.out.println("Done");

【问题讨论】:

  • 请阅读screenshot of HTML or code or error is a bad idea 的原因。考虑使用基于格式化文本的相关 HTML、代码试验和错误堆栈跟踪来更新问题。
  • 哦,对不起。我忘了添加代码行。我分享了我正在工作的 Element 的清晰图像的屏幕截图。我需要更新问题>?
  • 您是否检查过该元素是否不在框架内...?您能否提供绝对 xpath ..?
  • 感谢回复,但对象处于正常框架中。 Murthi 的评论解决了问题

标签: selenium selenium-webdriver xpath


【解决方案1】:

这可能是您的第一个 x-path 的问题。你可以试试下面的代码。它可能会起作用。

driver.findElement(By.xpath("//div[@class='ui selection dropdown']").click();
driver.findElement(By.xpath("//div[@class='menu transition visible']/div[text()='Male']").click();

【讨论】:

  • 我也写过一样的。请参考我分享的代码。感谢您的评论
  • xpaht 不同,请检查。我无法找到向上的课程。 //div[@class='ui 选择下拉菜单']"
  • 完美答案,但请解释一下为什么 U 省略了向上类?
  • 我的 chrome 浏览器中不存在向上,只有在我们执行某些操作时才可见。
  • 哦,是的。即使我只是通过在新浏览器中打开 URL 才注意到。第一次单击后将添加向上类,并在整个浏览器会话中保持添加。我很惊讶地看到对象的 DOM 细节的这种行为。元素的 bcoz 是否启用了 CSS 而不是 HTML?
【解决方案2】:

您的 driver.FindElement XPath 中缺少前面的通配符。

driver.findElement(By.xpath("//*div...")); 代替driver.findElement(By.xpath("//div..."));

目前,您的代码正在做的是告诉 XPath 定位器找到第一级 div(不容易,因为第一项几乎总是文档正文),但是通配符“*”告诉它可以查找任何级别的 div。

顺便说一句,请使用实际代码而不是图片在顶部编辑您的答案,以便其他有相同问题的人可以更轻松地找到他们的解决方案。

【讨论】:

  • 感谢您的回复。我尝试了同样的方法,但现在它说给定的 xpath 是 INVALIDSELECTOREXCEPTION。这是我在 Ur 建议后创建的路径://*div[@class='ui selection dropdown up']
  • 这是无效的选择器。通配符表示任何类型的元素——如果你像这样使用它:By.xpath("//*[contains(@class, 'share-layout-header')]),它会寻找任何具有这个的元素类型类 - div、h1、h2、h3 或任何其他元素。
【解决方案3】:

远射:

你用 Chrome 看源码,但 Selenium 用的是 Firefox。

有可能在两个浏览器之间呈现不同的源。具体来说,您的 xpath 依赖于类的完全匹配。我知道 FireFox 因修改源输出而臭名昭著。

我没有进行任何测试,但如果课程的顺序不同并且完全匹配失败,我不会感到惊讶。

如果是这种情况,有两种解决方案:

  1. 不要进行单一的完全匹配 (xpath = ""),而是将包含与 && 连接的混合(包含 ui && 包含选择 && 下拉菜单)
  2. 不要依赖控制台选项卡的输出。而是“查看页面源代码”并查看实际发送的内容,而不是浏览器正在解释的内容

【讨论】:

  • 感谢您的回复。我使用 chrome 只是为了阅读 Xpath,因为它比 Firefox 更容易。我在 Firefox 中执行脚本,因为在使用 Selenium 3.7.1 时我在 chrome 中遇到了一些已知错误
【解决方案4】:

先找到下拉容器元素,然后用它来寻找自己的后代,比如选项等。

driver.get("https://semantic-ui.com/modules/dropdown.html");

// find dropdown container element
WebElement dropdownWrapper = driver.findElement(
    By.xpath("//div[@class='html']/div[input[@name='gender']]"));

// expand drop down options by click on the container element
dropdownWrapper.click();
// or click the down arrow
dropdownWrapper.findElement(By.css('i')).click();

// select option
dropdownWrapper.findElement(By.xpath(".//div[text()='Female']")).click();

【讨论】:

    【解决方案5】:

    要定位文本为 Gender 的元素并选择选项Female,您可以使用以下Locator Strategy

    代码块:

    System.setProperty("webdriver.chrome.driver", "C:\\path\\to\\geckodriver.exe");
    WebDriver driver = new FirefoxDriver();
    driver.get("https://semantic-ui.com/modules/dropdown.html#selection");
    driver.findElement(By.xpath("//div[@class='another dropdown example']//div[@class='ui dropdown selection']")).click();
    driver.findElement(By.xpath("//div[@class='another dropdown example']//div[@class='ui dropdown selection active visible']//div[@class='menu transition visible']//div[@class='item' and contains(.,'Female')]")).click();
    System.out.println("Gender Female selected.");
    

    控制台输出:

    Gender Female selected.
    

    【讨论】:

      【解决方案6】:

      这可能有助于明确选择器的一般工作方式:

      1. .(dot):起始点代表当前节点。它告诉我们处理将从当前节点开始。

      2. 。 .(双点):它将选择当前节点的父节点。例如,//表/。 .将返回 div 元素,因为 div 是 table 元素的父元素。

      3. ‘*’:用于选择从当前节点下降的所有元素节点。例如:

      /table/*:会选择一个表格元素的所有子元素。

      //*:它将选择文档中的所有元素。

      //*[@id = 'username']:它将选择文档中具有名为“id”的属性且指定值为“username”的任何元素。

      1. @:表示一个属性,选择id、name、className等。例如:

      @id:它将选择文档中使用 id 属性定义的所有元素。无论它在文档中的何处定义。 //img/@alt:它将选择所有使用@alt 属性定义的img 元素。 //td[@*]: 它将选择所有具有任何属性的 td 元素。

      这里是文章的链接: https://www.scientecheasy.com/2020/07/selenium-xpath-example.html/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-12
        • 2021-02-11
        • 2016-07-01
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        • 2018-07-30
        相关资源
        最近更新 更多