【发布时间】:2012-01-18 08:53:50
【问题描述】:
我有一个 WebElement,我想将其属性值重置为其他值(例如,attr 是属性,我想将其原始 value=1 更改为新的 value=10)。
有可能吗?我正在使用 Selenium 2.0 (WebDriver.)
【问题讨论】:
我有一个 WebElement,我想将其属性值重置为其他值(例如,attr 是属性,我想将其原始 value=1 更改为新的 value=10)。
有可能吗?我正在使用 Selenium 2.0 (WebDriver.)
【问题讨论】:
您必须使用 JavascriptExecutor 类:
WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.getElementById('//id of element').setAttribute('attr', '10')");
【讨论】:
WebElement(例如:一个没有其他属性的简单<span>)有办法执行javascript并以某种方式传递对这个js元素的引用。 (也许 js 中的this 会引用它?)
WebElement(s) 传递给执行者并在脚本中访问arguments[0]([1,2...])。
如果您正在使用PageFactory 模式或已经引用了您的WebElement,那么您可能希望使用对WebElement 的现有引用来设置属性。 (而不是在你的 javascript 中使用document.getElementById(...))
以下示例允许您使用现有的 WebElement 参考设置属性。
代码片段
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.FindBy;
public class QuickTest {
RemoteWebDriver driver;
@FindBy(id = "foo")
private WebElement username;
public void exampleUsage(RemoteWebDriver driver) {
setAttribute(username, "attr", "10");
setAttribute(username, "value", "bar");
}
public void setAttribute(WebElement element, String attName, String attValue) {
driver.executeScript("arguments[0].setAttribute(arguments[1], arguments[2]);",
element, attName, attValue);
}
}
【讨论】:
driver.executeScript("arguments[0].setAttribute(arguments[1], arguments[2]);arguments[0].setAttribute(arguments[3], arguments[4]);", element, att1Name, att1Value, att2Name, att2Value);
基于先前答案的花哨 C# 扩展方法:
public static IWebElement SetAttribute(this IWebElement element, string name, string value)
{
var driver = ((IWrapsDriver)element).WrappedDriver;
var jsExecutor = (IJavaScriptExecutor)driver;
jsExecutor.ExecuteScript("arguments[0].setAttribute(arguments[1], arguments[2]);", element, name, value);
return element;
}
用法:
driver.FindElement(By.Id("some_option")).SetAttribute("selected", "selected");
【讨论】:
另一个回答这个问题的人可以在这里找到@nilesh https://stackoverflow.com/a/19934852/2079692
public void setAttributeValue(WebElement elem, String value){
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].setAttribute(arguments[1],arguments[2])",
elem, "value", value
);
}
这利用了 selenium findElementBy 函数,其中 xpath 也可以使用。
【讨论】:
'(arguments[0])[arguments[1]] = arguments[2]' 将适用于 value。
我创建了这个 jquery 来解决我的问题。
public void ChangeClassIntoSelected(String name,String div) {
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("Array.from($(\"div." + div +" ul[name=" + name + "]\")[0].children).forEach((element, index) => {\n" +
" $(element).addClass('ui-selected');\n" +
"});");
}
使用此脚本,您可以将实际的类名更改为其他名称。
【讨论】:
我已经针对同样的问题发布了类似的解决方案,
访问How to use javascript to set attribute of selected web element using selenium Webdriver using java?
这里首先我们在我的例子中找到了元素我使用 xpath 找到了元素然后我们遍历元素列表然后我们将驱动程序对象转换为 Executor 对象并在这里创建一个脚本第一个参数是元素和第二个参数是属性,第三个参数是新值
List<WebElement> unselectableDiv = driver
.findElements(By.xpath("//div[@class='x-grid3-cell-inner x-grid3-col-6']"));
for (WebElement element : unselectableDiv) {
// System.out.println( "**** Checking the size of div "+unselectableDiv.size());
JavascriptExecutor js = (JavascriptExecutor) driver;
String scriptSetAttr = "arguments[0].setAttribute(arguments[1],arguments[2])";
js.executeScript(scriptSetAttr, element, "unselectable", "off");
System.out.println(" ***** check value of Div property " + element.getAttribute("unselectable"));
}
【讨论】:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.getElementsByClassName('featured-heading')[0].setAttribute('style', 'background-color: green')");
我可以在java中使用上面的代码添加一个属性
【讨论】: