S-M*_*Man 8 java selenium arquillian-drone
我上课有一个要点a。因此,在硒代码中,我得到了这个:
WebElement element = driver.findElement(By.cssSelector(".a"));
Run Code Online (Sandbox Code Playgroud)
之后,我用单击它element.click();。click事件a从元素中删除该类-正是我要执行的测试用例。
所以,现在我想问元素是否已经拥有这个类:
element.getAttribute("class").contains("a");
Run Code Online (Sandbox Code Playgroud)
但这是行不通的,因为WebElement尝试通过给定的选择器再次查找该元素,这对我来说并不明确。我认为,一旦找到WebElement,它就会在整个作用域内部复制。但是很明显,每次在代码中被调用时,它都会调用链接的选择器。
因此,如何才能更持久地检索元素?如何避免WebElement每次调用时都刷新以跟踪已选择元素的更改?
当然,我可以使用使用DOM,父级或列表ID的变通办法。但是我真的想避免这种情况,因为我不想在测试代码中获得太多有关DOM结构的信息。这就是我添加类和ID的原因。
编辑:添加日志输出:
WebElement element = driver.findElement(By.cssSelector(".a"));
1564042692783 webdriver::server DEBUG -> POST /session/2d7cce7d-bd10-4814-b619-b4c8dc212fac/elements {"value":".a","using":"css selector"}
1564042692787 Marionette TRACE 0 -> [0,10,"WebDriver:FindElements",{"using":"css selector","value":".a"}]
1564042692793 Marionette TRACE 0 <- [1,10,null,[{"element-6066-11e4-a52e-4f735466cecf":"517f4e9c-5d09-4fe0-8c34-4d8c153a9c4a","ELEMENT":"517f4e9c-5d09-4fe0-8c34-4d8c153a9c4a"}]]
1564042692794 webdriver::server DEBUG <- 200 OK {"value":[{"element-6066-11e4-a52e-4f735466cecf":"517f4e9c-5d09-4fe0-8c34-4d8c153a9c4a"}]}
Run Code Online (Sandbox Code Playgroud)
如您所见,收到的元素是517f4e9c-5d09-4fe0-8c34-4d8c153a9c4a。
element.click();
1564042703055 webdriver::server DEBUG -> POST /session/2d7cce7d-bd10-4814-b619-b4c8dc212fac/elements {"value":".a","using":"css selector"}
1564042703058 Marionette TRACE 0 -> [0,11,"WebDriver:FindElements",{"using":"css selector","value":".a"}]
1564042703065 Marionette TRACE 0 <- [1,11,null,[{"element-6066-11e4-a52e-4f735466cecf":"517f4e9c-5d09-4fe0-8c34-4d8c153a9c4a","ELEMENT":"517f4e9c-5d09-4fe0-8c34-4d8c153a9c4a"}]]
1564042703066 webdriver::server DEBUG <- 200 OK {"value":[{"element-6066-11e4-a52e-4f735466cecf":"517f4e9c-5d09-4fe0-8c34-4d8c153a9c4a"}]}
1564042703142 webdriver::server DEBUG -> POST /session/2d7cce7d-bd10-4814-b619-b4c8dc212fac/element/517f4e9c-5d09-4fe0-8c34-4d8c153a9c4a/click {"id":"517f4e9c-5d09-4fe0-8c34-4d8c153a9c4a"}
1564042703145 Marionette TRACE 0 -> [0,12,"WebDriver:ElementClick",{"id":"517f4e9c-5d09-4fe0-8c34-4d8c153a9c4a"}]
1564042703380 Marionette DEBUG Canceled page load listener because no navigation has been detected
1564042703382 Marionette TRACE 0 <- [1,12,null,{}]
1564042703384 webdriver::server DEBUG <- 200 OK {"value":null}
Run Code Online (Sandbox Code Playgroud)
现在检查:
element.getAttribute("class");
1564042714064 webdriver::server DEBUG -> POST /session/2d7cce7d-bd10-4814-b619-b4c8dc212fac/elements {"value":".a","using":"css selector"}
1564042714067 Marionette TRACE 0 -> [0,13,"WebDriver:FindElements",{"using":"css selector","value":".a"}]
1564042714070 Marionette TRACE 0 <- [1,13,null,[]]
1564042714071 webdriver::server DEBUG <- 200 OK {"value":[]}
Run Code Online (Sandbox Code Playgroud)
如您所见,现在没有元素返回。
编辑:评估@RahulL的解决方案(似乎可行;单击执行时,不再WebDriver:FindElements记录任何调用-与我的日志相反),我认为问题出在包裹我的Selenium 的Aquillian Graphene实现中。该findElement()调用不会直接调用Selenium类。这就是为什么我添加了这些标签。这可能与发现问题有关。
因此,类定义:
import static org.junit.Assert.assertFalse;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.drone.api.annotation.Drone;
import org.jboss.arquillian.junit.Arquillian;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
@RunWith(Arquillian.class)
@RunAsClient
public class MyTests {
@Drone
WebDriver driver;
@Test
public void test_removeClassFromElement() {
driver.navigate().refresh();
driver.get("my.application");
WebElement element = driver.findElement(By.className("a"))
element.click();
assertFalse(
element .getAttribute("class").contains("a")
);
}
}
Run Code Online (Sandbox Code Playgroud)
和arquillian.xml:
<?xml version="1.0" encoding="UTF-8"?>
<arquillian xmlns="http://jboss.org/schema/arquillian"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/schema/arquillian
http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
<extension qualifier="webdriver">
<property name="browser">firefox</property>
<property name="firefoxLogLevel">FINEST</property>
</extension>
</arquillian>
Run Code Online (Sandbox Code Playgroud)
在 JAVA 绑定 + Firefox 驱动程序中测试了您的场景。点击从div中删除'mystyle'并能够获取不带'mystyle'的属性类
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
.mystyle {
width: 100%;
padding: 25px;
background-color: coral;
color: white;
font-size: 25px;
box-sizing: border-box;
}
</style>
</head>
<body>
<p>Click the "Try it" button to toggle between adding and removing the "mystyle" class name of the DIV element:</p>
<div id="myDIV" onclick="myFunction()" class="mystyle">
This is a DIV element.
</div>
<script>
function myFunction() {
var element = document.getElementById("myDIV");
element.classList.remove("mystyle");
}
</script>
</body>
</html>Run Code Online (Sandbox Code Playgroud)
JAVA代码:
WebElement element = driver.findElement(By.className("mystyle"));
element.click();
System.out.println(element.getAttribute("class"));
Run Code Online (Sandbox Code Playgroud)
启用 FirefoxDriverLogLevel.TRACE 。网络驱动程序日志
查找元素
WebElement 元素 = driver.findElement(By.className("mystyle"));
webdriver::server DEBUG -> POST /session/81662ee0-1195-4ff3-8687-667f3607ea89/element {
"value": ".mystyle",
"using": "css selector"
}
Run Code Online (Sandbox Code Playgroud)得到了元素
webdriver::server DEBUG <- 200 OK {"value":{"element-6066-11e4-a52e-4f735466cecf":"c15725f8-89f9-4fec-af08-be1b9487defe"}}
现在单击该元素
元素.click();
webdriver::server DEBUG -> POST /session/81662ee0-1195-4ff3-8687-667f3607ea89/element/c15725f8-89f9-4fec-af08-be1b9487defe/click {
"id": "c15725f8-89f9-4fec-af08-be1b9487defe" }
Run Code Online (Sandbox Code Playgroud)现在发送“getAttribute”
element.getAttribute("类")
webdriver::server DEBUG -> POST /session/81662ee0-1195-4ff3-8687-667f3607ea89/execute/sync { "script": "这里 selenium 发送 getAttribute 脚本", "args": [ { "element-6066-11e4 -a52e-4f735466cecf”:“c15725f8-89f9-4fec-af08-be1b9487defe”},“类”]}
5 回应:
webdriver::server DEBUG <- 200 OK {"value":""}
Run Code Online (Sandbox Code Playgroud)
得到类的值为 "" 。“.mystyle”不存在
从上面的日志来看,一旦使用 selenium 找到元素并将其分配给“element”,它就不会再次发送 post 请求来查找元素。c15725f8-89f9-4fec-af08-be1b9487defe 在单击和 getAttribute 中保持相同。(网络驱动程序协议)
如果您在 JAVA 绑定中使用 @FindBy 注释,那么 Selenium 将尝试在使用 proxy 的每个操作中一次又一次地查找元素。这将在大多数情况下避免 staleelemnt 异常。
为了避免不稳定并更持久地检索元素,您将需要使用不会更改的属性。
| 归档时间: |
|
| 查看次数: |
264 次 |
| 最近记录: |