【问题标题】:How to search for an element using an attribute in selenium and java如何使用 selenium 和 java 中的属性搜索元素
【发布时间】:2018-05-25 08:40:30
【问题描述】:

我正在尝试在 selenium 中编写一些代码,让我通过使用属性“gamename”的值来选择一个元素。

当我检查代码时,我得到了这个:

h4 class= "cardTitle_1ifib5" role="gamename">Test Web </h4>

我可以通过 xpath 进行选择:

"//*[@id="root"]/div/main/article/div[1]/div[1]/a/section/div[1]/h4"

但我希望每次都能按游戏名称的值进行搜索,以便可以使用数据提供者进行搜索。

为了清楚起见,我想在每次运行该功能时更改“测试 Web”部分,因为这就是将要更改的内容。选择器如下:

root > div > main > article > div.cards_f1mxfh > div:nth-child(2) > a > section > div.cardTop_1ead8bu > h4

我不知道这是否有帮助

【问题讨论】:

  • 已从代码检查部分的末尾删除,不知道为什么
  • 你能提供你正在测试的链接吗?
  • 你试过了吗:String text = driver.findElement(By.xpath("your xpath")).getText(); System.out.println(text);
  • 我可以只使用 xpath 选择链接,但我希望能够通过插入“游戏名”来选择元素。所以每次我运行测试时,我都可以插入名称,因为我有一些游戏,它们都有相似的 xpath。
  • 使用 Xpath as::"//h4[contains(text(),'Test Web')]"

标签: java selenium user-interface automation


【解决方案1】:

你想找到确切的文本,XPath 似乎就是它:

webDriver.findElement(By.xpath("//h4[contains(text(), '" + yourTestLucas + "')]"));

通过这样做,您可以随时由数据提供者将值传递给它。

当我阅读您的 cmets 时,您可以将其作为一种方法:

案例1:如果你只想找到这个元素:

public WebElement findElementWithRoleName(String yourTestLucas) {
    return webDriver.findElement(By.xpath("//h4[contains(text(), '" + yourTestLucas + "')]"));
}

案例2:如果你想点击这个元素:

public void clickElementWithRoleName(String yourTestLucas) {
    webDriver.findElement(By.xpath("//h4[contains(text(), '"+ yourTestLucas + "')]")).click();
}

【讨论】:

  • 如果我想点击这个元素,我该怎么做,我对自动化测试很陌生
  • @fearghalOreilly 我更新了我的答案,希望它能给你一些想法:)
  • 非常感谢,虽然我刚刚意识到我没有很好地解释它,角色名称并没有改变,它的角色的价值,所以基本上“测试卢卡斯”是我想要改变的每个测试不是游戏名称

    测试卢卡斯

  • 仍然无法工作:))) 如果它有任何帮助,这就是 CSS #root > div > main > article > div.cards_f1mxfh > div:nth-child(2) > a > section > div.cardTop_1ead8bu > h4
  • 通常这些东西没有问题,只是由于某种原因没有选择它
【解决方案2】:

Selenium 有一个选项,您可以通过它获取元素的检索属性。 [yourXpath].getAttribute("name");

【讨论】:

  • 嗨,是的,我知道该怎么做,但是每次我运行代码时,我如何才能将“name”属性作为变量字符串输入,这样它就会使用字符串找到元素?
  • 我不确定我是否理解,对于该属性,您将有一个动态字符串来搜索?它可能会从一个执行变为另一个?
  • 是的,那是正确的,我基本上测试了一个页面上有不同游戏卡的页面,它是一个“游戏大厅”,但每个游戏都有不同的名称,所以我希望能够按名称搜索,它们没有特定的顺序,因此 xpath 不起作用,css 选择器也不起作用
  • 好的,谢谢您的信息。在这种情况下,我想到的第一个解决方案是,也许您可​​以将游戏大厅中的所有信息提取出来,将其存储在一个数组中,然后通过regex matcher搜索,匹配您感兴趣的信息。这个可以使用matcherpattern 完成。我不确定这是否适用于您的情况,但如果您愿意,可以尝试一下
【解决方案3】:

根据您共享的 HTML 和您的代码尝试通过 value 属性识别元素,您可以使用以下 定位器策略

  • xpath

    "//h4[starts-with(@class,'cardTitle_1ifib') and @role='gamename'][normalize-space()='Test Web']"
    

【讨论】:

  • ,你不应该。根据这个问题,我的解决方案基于静态字符串 gamename。如果您想通过function() 调用传递变量String,您可能需要根据您的新要求提出一个新问题,因为您现在无法更改问题,因为基于您当前的几个经过充分研究的答案的到来问题。
【解决方案4】:

如果我对问题的理解正确,这里有几个例子如何实现属性元素处理:

1.通过 CSS 选择器:

webDriver.findElements(By.cssSelector("h4[role ='gamename']");

2。通过 xPath:

webDriver.findElements(By.xpath("//h4[@role='gamename']"))

webDriver.findElements(By.xpath("//*[@role='gamename']"))

3.通过 WebElement 方法:

WebElement element = driver.findElement(...);
element.getAttribute("role")

这个例子中的一些应该可以工作。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多