当前位置: 首页 > 知识库问答 >
问题:

获取已找到的WebElement的By定位器

闻人浩波
2023-03-14

有没有一种优雅的方法来获取我已经找到/识别的Selenium WebElement的By定位器?

为了明确这个问题:我想要用于查找元素的“通过定位器”。在这种情况下,我对特定的属性或特定的定位器(如css-locator)不感兴趣。

我知道我可以解析WebElement的toString()方法的结果:

WebElement element = driver.findElement(By.id("myPreciousElement"));
System.out.println(element.toString());

例如,输出为:

[[FirefoxDriver:WINDOWS上的firefox(..)]-

如果通过xpath找到元素:

WebElement element = driver.findElement(By.xpath("//div[@someId = 'someValue']"));
System.out.println(element.toString());

那么您的输出将是:

[[FirefoxDriver:WINDOWS上的firefox(..)]-

因此,我目前编写了自己的方法来解析此输出,并提供定位器“重新创建”的结果。


如果您确定没有现成的,那么您能想出API创建者可能不提供此功能的任何原因吗?



*尽管这与问题无关,但如果有人想知道您为什么需要此功能,请举两个例子:

  • 如果使用PageFactory,则很可能不会将定位器作为页面类中的成员变量,但稍后在处理页面元素时可能需要它们
  • 您使用的是那些只使用页面对象模式而不使用PageFactory的人的API,因此希望您交付定位器而不是元素本身*

共有3个答案

蒲昀
2023-03-14

硒没有提供优雅的方式。这太可怕了

1) PageObjectPageFactory意味着我们在Page类中有WebElements,但我们没有这些元素的定位器。

2) 如果我使用webElement查找元素作为当前元素的后代。findElement(By),则即使在变量中存储了父对象的定位器,我也没有此子代的定位器。

3)如果我使用的findElements函数返回的List的元素,那么我没有每个特定元素的定位器。

4) 为元素使用定位器是有用的,至少因为使用定位器作为参数的ExpectedConditions比使用WebElement作为参数ExpectedConditions实现得更好。

对我来说,Selenium是一个构思不周、实施不力的库

潘弘博
2023-03-14

不,没有。我已经作为代理实施了一个可能的解决方案

public class RefreshableWebElement implements WebElement {

    public RefreshableWebElement(Driver driver, By by) {
        this.driver = driver;
        this.by = by;
    }

    // ...

    public WebElement getElement() {
        return driver.findElement(by);
    }

    public void click() {
        getElement().click();
    }

    // other methods here
}
颛孙晗昱
2023-03-14

没有默认情况下,没有。不能从以前找到的WebElement中提取By。然而,通过自定义解决方案是可能的。

可以实现自定义解决方案,但Selenium不提供现成的解决方案。

考虑以下,关于“为什么”...

By by = By.id("someId");
WebElement e = driver.findElement(by);

您已经有了By对象,因此您不需要调用类似于e.getBy()

 类似资料:
  • 问题内容: 是否有一种优雅的方法来获取我已经发现/识别的Selenium WebElement的“按”定位器? 要明确这个问题:我希望使用“按定位器”来查找元素。在这种情况下,我对特定属性或特定位置(如css-locator) 不 感兴趣。 我知道我可以解析WebElement的toString()方法的结果: 输出例如: [[FirefoxDriver:WINDOWS(....)上的Firefo

  • 我遵循一个页面对象模型,并使用一个基类,该基类具有所有通用和可重用的方法,并为我的web应用程序的每个页面提供单独的页面。 现在,我正在尝试在BasePage中创建一个可以在其他页面中使用的方法。在每个页面中,我都使用了页面工厂作为元素。 我在我的BaseClass中使用下面的方法,并且我坚持将定位器提取到下面的方法中,以便我可以在所有页面中针对不同的元素定位器使用此方法。 我被困在这里: 我使用

  • 我使用了以下代码, 这会引发错误“表达式不是合法表达式”。“代码:“12”nsresult:“0x805b0033(SyntaxError)”位置:”“]”。 当我缩小搜索范围到 它工作正常,我得到了特定行中的所有文本。然而,当我将其扩展到特定于第1个代码中所示的列时,我得到了错误。 html代码段,

  • 在我的项目中使用JavaSelenium和Page Object,想要创建一个自定义方法,将两个字符串作为参数,组合它们并调用右webelement来执行一些操作。 下面的例子我的页面对象 } 例如,调用该方法: 调用此方法应执行click on question1Yes元素。

  • 我有一个带有和的activity。我正在使用水平显示图像列表。当我单击中的图像时,activity中的将显示该图像的更大图片。到目前为止一切正常。 现在activity中又多了两个:和。当我单击时,中的图像应该向左转,并且中的缩略图应该反映这个变化。的情况也类似。 我可以旋转。但是,如何在中旋转缩略图呢?如何获取的? 代码: activity XML: 我的activity代码: 我得Recycl

  • 我试图从html代码中获取子元素(卡号),其中html标记和类名相同。下面是html代码片段 下面是我尝试的标识符。但都返回了第一个卡号 "************4305”。 尝试了其他选项:这也返回了第一个卡号“************4305”。