gpt4 book ai didi

java - 当 Selenium2 findElement 失败时故障转移到 JavascriptExecutor?

转载 作者:行者123 更新时间:2023-12-01 04:17:30 27 4
gpt4 key购买 nike

如果 Selenium2 在轮询有限时间后未能检索到 WebElement 对象,我有一个想法,即故障转移到 JavascriptExecutor。正如您所看到的,该方法有一个限制,即在调用 getElementByLocator 时需要预先定义“故障转移”Javascript 代码段。我想不出任何方法来动态地做到这一点。如果有人可以帮助我改进这一点,我将奖励最佳建议的答案,无论它有多小。

// failover example1: "document.getElementById('gbqfb')"
// failover example2: "document.querySelector("div#gbqfb")"
public static WebElement getElementByLocator(final By locator, String failover) {
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS);
.ignoring(NoSuchElementException.class,StaleElementReferenceException.class);
WebElement we = wait.until( ExpectedConditions
.presenceOfElementLocated( locator ) );
if ( we.isNull() ) {
JavascriptExecutor js = (JavascriptExecutor) driver;
if ( !failover.isEmpty() ) {
we = (WebElement)js.executeScript( failover );
if ( we.isNull() ) LOG.info("Still couldn't get element.");
} else {
LOG.info("No failover String available. Cannot try with " +
"a JavascriptExecutor.");
}
}
return we;
}

最佳答案

其实回答过类似的问题here

我不建议像这样将任何东西委托(delegate)给javascript..使用Selenium给你的东西..它已经足够了。

我在我构建的每个框架中都放入了一些东西,这是非常有效的。这是从框架中找到的摘录 here .

在对对象执行任何操作之前,我实现了一种伪等待类型的方法。自己尝试一下。效率非常高。

这些是来自 AutomationTest 的方法类

/**
* Checks if the element is present or not.<br>
* @param by
* @return <i>this method is not meant to be used fluently.</i><br><br.
* Returns <code>true</code> if the element is present. and <code>false</code> if it's not.
*/
public boolean isPresent(By by) {
if (driver.findElements(by).size() > 0) return true;
return false;
}

/**
* Private method that acts as an arbiter of implicit timeouts of sorts.. sort of like a Wait For Ajax method.
*/
private WebElement waitForElement(By by) {
int attempts = 0;
int size = driver.findElements(by).size();

while (size == 0) {
size = driver.findElements(by).size();
if (attempts == MAX_ATTEMPTS) fail(String.format("Could not find %s after %d seconds",
by.toString(),
MAX_ATTEMPTS));
attempts++;
try {
Thread.sleep(1000); // sleep for 1 second.
} catch (Exception x) {
fail("Failed due to an exception during Thread.sleep!");
x.printStackTrace();
}
}

if (size > 0) System.err.println("WARN: There are more than 1 " + by.toString() + " 's!");

return driver.findElement(by);
}

我所做的就是任何时候我执行某件事,例如

getText(By.cssSelector("input#someId"))

如果第一次没有找到,会等待1秒。如果找到则继续。随后执行 5 次,因此总共等待 5 秒..这是完全可以的,因为如果您没有找到所需的元素,那么您的测试实际上应该在此时失败。

此外,根据经验,我可以告诉您使用 driver.findElements() 比那些 WebDriverWait 更有效。

这并不意味着我不使用它们..只是不是为了这个。不幸的是,我没有将这个功能添加到 selenium 框架入门中,所以我只告诉你我何时使用 Webdriverwait 的。

所以我的测试看起来像 -

@Config(url="http://systemunder.test", browser=CHROME)
public class MyClass extends AutomationTest {

@Test
public void testSomething() {
setText(By.id("blah")) // if <* id="blah" /> doesn't exist, waits 1+ seconds for it to appear before interacting.
.click(By.id("Blah2")) // ^ same thing here.
.waitForPresent(By.cssSelector("ajaxy")); // this method right here would circumvent the hard waits, with webdriverwait's.
}
}

我不记得为什么它以前对我不起作用,但是在类似的事情中使用 webdriverwaits 是完美的。

关于java - 当 Selenium2 findElement 失败时故障转移到 JavascriptExecutor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19286092/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com