我在 Linux 机器上运行我的测试,并且使用以下代码,它无法正确键入文本 -
visibleElement.clear();
visibleElement.sendKeys("I am running on linux machine");
在UI中,实际上输入了不同的文本 - "在linux机器上运行","我在linux机器上运行"等
因此,为了解决这个问题,我使用了这样的JavaScript -
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].value='I am running on linux machine';", visibleElement);
这将在文本字段中键入文本,但是键入此按钮后,Save
按钮应启用但未启用。
但是,如果使用sendKeys
,则会启用该按钮。
你能告诉我为什么这个javascript的行为不同并提供正确的javascript吗?
这两件事如何在单个解决方案中工作(无需点击选项卡以启用按钮,因为这在我的情况下不正确(?
设置arguments[0].value = "..."
设置文本字段的值,但不会在该元素上触发任何事件。"保存"按钮可能正在等待<form>
内某处发生change
事件。您需要使用 JavaScript 在文本框上手动触发更改事件。请参阅如何手动触发 onchange 事件?。
你描述的行为让我觉得 JavaScript 已经在监听更改事件,然后打乱单词的顺序,就好像 Yoda 已经输入了它们一样。(或者打出尤达有的?手动触发更改事件可能会启用"保存"按钮,并且您最终仍可能会得到与使用sendKeys
相同的文本。如果是这种情况,您可能还想使用 JavaScript 启用"保存"按钮:
// Set the input text
jse.executeScript("arguments[0].value='I am running on linux machine';", visibleElement);
// Find the "Save" button
WebElement saveButton = driver.findElement(...);
// Enable the save button
jse.executeScript("arguments[0].disabled = false;", saveButton);
saveButton.click();
从元素可见开始并不能保证元素也是可交互的,即可点击的,或者您可以直接调用sendKeys()
。
要在所需元素中调用sendKeys()
,您需要诱导WebDriverWait等待elementToBeClickable()
,您可以使用以下定位器策略:
WebElement clickableElement = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(visibleElement))
clickableElement.click();
clickableElement.clear();
clickableElement.sendKeys("I am running on linux machine");
您可以在如何通过Selenium和C#保留通过SendKeys((方法发送的字符序列中找到相关的详细讨论
TL; DR
硒:硒如何识别可见或不可见的元素?它有可能在 DOM 中加载但不在 UI 上呈现吗?
尝试以 promise 风格或 async/await 风格编写。
async clear_elem(elem) {
// elem.clear(), MAY not work always because of some background JS
await elem.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, 'a'));
await elem.sendKeys(protractor.Key.DELETE);
// Can await here for Application Load
}
reverse_string = as => as.split('').reverse().join();
// intersperse - Places an Item in between elements of an array
// ex: intersperse('k')("abc") => ['a', 'k', 'b', 'k', 'c']
intersperse = x => as => as.split('').reduce((acc, x) => [...acc, a, x], []).slice(0, -1);
(async () => {
// Assuming you have element - visibleElement
await browser.wait(protractor.ExpectedConditions.elementToBeClickable(visibleElement), default_timeout);
await clear_elem(visibleElement);
const str = reverse_string('I am running on linux machine');
const sequence_of_characters = intersperse(protractor.Key.HOME)(str);
// e, HOME, n, HOME, i, HOME, h, HOME, ...
await visibleElement.sendKeys(protractor.Key.chord(...sequence_of_characters));
})();