【问题标题】:Sorting a WebElement List to find specific Element (Selenium WebDriver/Java)对 WebElement 列表进行排序以查找特定元素 (Selenium WebDriver/Java)
【发布时间】:2018-05-24 03:52:20
【问题描述】:

我想以一种非常具体的方式搜索一个非常具体的 WebElement。

WebElement 如下所示:

<aw>
    <div class="class">
        <h1>
            <a class="class1">TEXT TO FIND 1</a> 
        </h1>
        <p>
            <a class="class2"> TEXT TO FIND 2 </a>
        </p>
    </div>
</aw>

"text to find" 都可以写成 "t e xt to fi nd" (这使得 contains() 过时)。 正因为如此,我想细分我需要在字符中搜索的两个字符串,然后搜索一个包含所有字符的元素,最大容差为 1 个字符。

这个例子^

getCorrectElement(String1, String2) -> 返回 WebElement

在 (h1/a) [String1] 中搜索“text”,在 (p/a) [String2] 中搜索“cat”

  • 将两个字符串拆分为字符数组

  • 列出所有包含"t"的元素;

  • 获取该列表中包含"e"的所有条目;

  • 重复直到没有单词/没有找到元素,

    if 没有找到元素,尝试查看是否有前一个(或者可能是字符的组合(一如既往,我们有 1 个字符容差),例如。 @987654327 @ @2 3 没有找到,但是我们有一个匹配的元素 2 3如果我们有这样的东西,选择这个元素(或者更好的是,将它添加到新列表中)。

  • 现在我们有一个列表,其中仅包含“文本”为 (h1/a) 的 WebElement 我们将使用它来优化我们的搜索。

  • 我们使用刚刚创建的列表并执行与之前完全相同的过程。

  • 操作完成(找到同时具有“text”(h1/a)和“cat”(p/a)的元素,返回正确的WebElement

这意味着如果输入了"Cool Catto",但没有完全匹配它的元素,它将继续匹配大部分匹配的下一个元素(最多1个字符容差)。

所以"Cool Catto" = "Col Catt",还有"Cool Catto" = "C o o l Catt o"

我尝试让 xpath 搜索 toText(),但是这个 xpath 表达式 a[contains(text(), ' text to find ')]/../../p/a[contains(text(),' text to find')],仅返回 "text to find 2" 而不是两者。

如果我使用[contains() and contains()],则表达式返回可能只匹配单个"text to find" 的元素,而我需要只匹配两者的元素。

另外,我很确定你不能做String->WebElement,所以这个方法总是错的

我该怎么做这样的事情?还有其他方法吗? 我想到了地图,但我没有太多经验。

【问题讨论】:

  • 您能否总结一下您尝试locate/getText()的确切条件(text + HTML_TAG)?

标签: java selenium xpath


【解决方案1】:

性能会差很多,但您可以返回可能元素的列表,然后在您的 Java 代码中执行更高级的过滤。我在示例中使用的是 C#,但 Java 等效项应该非常相似。

var element = webDriver
    // Find all elements that are a direct child of the parent element
    .FindElements(By.CssLocator("aw > div.class > *"))
    // Get the first element matching the criteria
    .FirstOrDefault(e => {
        // Simply remove spaces. Regex could also be used
        string.Equals(e.Text.Replace(" ", ""), "TEXTTOFIND");
    });

我说性能会更差,因为 WebDriver 将不得不查询/序列化更多对象,如果很多对象可能会导致明显的延迟。这是我仅在 CSS 或 jquery 选择器不足时使用的模式。 [我们] 有数百个测试需要几个小时才能运行,因此这些延迟是一个相当大的问题。

【讨论】:

    猜你喜欢
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多