Java 如何在每次调用变量时调用方法

Java 如何在每次调用变量时调用方法,java,selenium,dynamic,Java,Selenium,Dynamic,所以我有一个使用方法的变量。大概是这样的: By locator = By.id("something-"+getDynamicId()); 通常id会这样更改数字:something-1到something-2(不是那些确切的数字,总是不同的)。我有一种方法可以通过调用getDynamicId()方法来获取它更改为的数字。问题是,当我开始我的测试时,id是在开始时设置的,每当我点击一个特定的按钮,id就会改变,但我的变量不会改变。定位器变量是否可以在每次调用定位器时调用getDynamicI

所以我有一个使用方法的变量。大概是这样的:

By locator = By.id("something-"+getDynamicId());
通常id会这样更改数字:something-1到something-2(不是那些确切的数字,总是不同的)。我有一种方法可以通过调用getDynamicId()方法来获取它更改为的数字。问题是,当我开始我的测试时,id是在开始时设置的,每当我点击一个特定的按钮,id就会改变,但我的变量不会改变。定位器变量是否可以在每次调用定位器时调用getDynamicId()?也许每次我点击特定的按钮定位器就会重新加载


我已经查找了类加载器,但我不知道如何使用它,也不知道它是否可以做我想做的事情。

我没有这样做,而是使用CSS绕过了动态ID

driver.findElement(By.cssSelector("element[id^='something']"));
这意味着“查找一个
标记,该标记具有
id
属性,该属性
某物开头”

如果有多个元素与此匹配,那么您需要增加您的特异性。您可以通过选择一些父项来实现这一点

div.some-div [id^='something']

            ^  the space here meaning "a descendent of.."

可能有助于为Selenium制定这样的CSS选择器。

此外,除了@sircapsalot所做的工作外,您还可以使用xpath处理动态ID,如下所示(正如您在评论中所说,有多个元素的ID包含“某物”):

然后,您可以在main方法中直接调用此方法,如下所示:

  clickOnDynamicElement("something-"); //because main method is also static, it can call the method directly.

使用观察者模式我不能这样做,因为这不是唯一的定位器,这只是一个例子。有数百个以某个东西开头,每次单击某个东西时,它们都会以某个随机数移动。然后也使用父/子选择器。您可以组合选择器。
div.some-parent元素[id^='something']
不止一个元素带有something检查上面的第一个代码。我修改了它,点击第三个元素,其中id带有“something-”。这有帮助吗?第二个代码可能也会有帮助,因为您正在该方法中生成动态id,然后与“something”连接-“文本,然后使用它作为定位器单击元素。List elements=driver.findElements(By.xpath(//tag[contains(@id,'something-'))]”);这只会在一开始起作用。当我单击某个对象并且所有ID都更改时,所有这些元素现在都可能无效。然后请尝试创建新方法的第二个想法
clickOnDynamicElementById
。这样,您将每次生成动态ID,然后与“something-”连接以生成相关ID,然后单击它。
public static void clickOnDynamicElementById(String partial_locator_id){

    //Code for getting dynamic id and then storing the retrieved dynamic ID in a string, say "dynaID";

    String locator_id_to_click = partial_locator_id + dynaID;

    driver.findElement(By.id("locator_id_to_click")).click();

}
  clickOnDynamicElement("something-"); //because main method is also static, it can call the method directly.