JMeter - 移动设备请求使用 JSR223 和 groovy 进行仿真 - 没有这样的 属性:ExpectedConditions 错误

JMeter - mobile devices requests emulation with JSR223 & groovy - No such property: ExpectedConditions error

我正在尝试模拟来自移动设备的 https 请求以进行客户端性能测试,使用 JSR223 + groovy,问题是我无法以这种方式执行单击“全部接受” Cookies”页面上的 span 元素。

回复:

Response message:javax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: ExpectedConditions for class: Script7

在脚本的 'desctop' 部分,xpath(通过 WebDriver 采样器实现)并单击此“接受所有 Cookie”span 元素 100% 正确工作 - 因此我知道 xpath 是正确的。

能否请您看一下问题并分享您的想法和任何提示,JSR223 中问题的原因可能在哪里以及如何解决?

代码在这里:

import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.util.concurrent.TimeUnit;

System.setProperty("webdriver.chrome.driver", "${webdriver_path}");

Map<String, Object> deviceMetrics = new HashMap<>();
deviceMetrics.put("width", ${width});
deviceMetrics.put("height", ${height});
deviceMetrics.put("pixelRatio", ${pixelRatio});
Map<String, Object> mobileEmulation = new HashMap<>();
mobileEmulation.put("deviceMetrics", deviceMetrics);
mobileEmulation.put("userAgent", "${userAgent}");
Map<String, Object> chromeOptions = new HashMap<>();
chromeOptions.put("mobileEmulation", mobileEmulation);
//DesiredCapabilities capabilities = DesiredCapabilities.chrome();
//capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);

ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("mobileEmulation", mobileEmulation);
ChromeDriver driver = new ChromeDriver(options);
driver.get("https://${HOST_MAIN}");

WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[contains(text(), 'Accept All Cookies')]")));
driver.findElement(By.xpath("//span[contains(text(), 'Accept All Cookies')]")).click();

//this way doesn't work too:
//WebDriverWait(driver, 20).until(EC.element_to_be_clickable(By.xpath("//span[contains(text(), 'Accept All Cookies')]"))).click();

log.info(driver.getTitle());
driver.quit();

如何在客户端使用 JSR223 模拟移动设备时实现相同的操作?

对我来说似乎是错字或 copy-paste 问题,您需要将其更改为:

import org.openqa.selenium.support.ui.ExpectedCondition;

到这一行:

import org.openqa.selenium.support.ui.ExpectedConditions;

因为它必须完全合格且正确 ExpectedConditions class 名称

也不要将 JMeter 函数或变量内联到 JSR223 脚本中,因为:

  1. 它们被缓存,在后续迭代中您将获得相同的值
  2. 它们可能会分解成导致逻辑故障或编译失败的东西
  3. 它们与 Groovy GString templates
  4. 冲突

所以不用 "${webdriver_path}" 使用 vars.get("webdriver_path") 等等,其中 vars 是 shorthand for JMeterVariables class instance. See Top 8 JMeter Java Classes You Should Be Using with Groovy 的文章以获取更多详细信息