Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于在文本字段中键入的Javascript执行与sendKeys不同_Javascript_Java_Selenium_Selenium Webdriver_Selenium Chromedriver - Fatal编程技术网

用于在文本字段中键入的Javascript执行与sendKeys不同

用于在文本字段中键入的Javascript执行与sendKeys不同,javascript,java,selenium,selenium-webdriver,selenium-chromedriver,Javascript,Java,Selenium,Selenium Webdriver,Selenium Chromedriver,我在Linux机器上运行我的测试,并且有以下代码,它不能正确地键入文本- visibleElement.clear(); visibleElement.sendKeys("I am running on linux machine"); 在UI中,实际上输入了不同的文本,比如“在linux机器上运行”、“在linux机器上运行”等等 因此,为了处理这个问题,我像- JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeS

我在Linux机器上运行我的测试,并且有以下代码,它不能正确地键入文本-

visibleElement.clear();
visibleElement.sendKeys("I am running on linux machine");
在UI中,实际上输入了不同的文本,比如“在linux机器上运行”、“在linux机器上运行”等等

因此,为了处理这个问题,我像-

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].value='I am running on linux machine';", visibleElement);
这会按文本字段中的方式键入文本,但键入后,会出现
Save
按钮,该按钮预计将启用,但未启用

但如果使用了
sendKeys
,则该按钮将启用

你能告诉我为什么这个javascript行为不同,并提供正确的javascript吗


这两种方法如何在单个解决方案中工作(不点击tab键启用按钮,因为这在我的情况下是不正确的)?

尝试以承诺风格或异步/等待风格编写

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));
})();

设置
参数[0]。value=“…”
设置文本字段上的值,但不会在该元素上触发任何事件。“保存”按钮可能正在等待
更改
事件在
中的某个位置发生。您需要使用JavaScript在文本框上手动触发更改事件。看

您描述的行为让我觉得JavaScript已经在侦听更改事件,然后扰乱单词的顺序,就好像尤达已经键入了它们一样。(或者键入Yoda的?)手动触发更改事件可能会启用“保存”按钮,并且您仍然可能会得到使用
sendKeys
会产生的相同文本。如果是这种情况,您可能还希望使用JavaScript启用“保存”按钮:

//设置输入文本
jse.executeScript(“参数[0].value='我正在linux机器上运行';”,visibleElement);
//找到“保存”按钮
WebElement saveButton=driver.findElement(…);
//启用“保存”按钮
jse.executeScript(“参数[0].disabled=false;”,saveButton);
保存按钮。单击();

以元素可见开始并不能保证元素是可交互的,即可点击的,或者您可以直接调用
sendKeys()

要在所需元素中调用
sendKeys()
,您需要为
elementtobelickable()
引入WebDriverWait,并且可以使用以下方法:

您可以在中找到相关的详细讨论


tl;博士

您是否尝试过显式等待和
元素可选择
?是的,我尝试过
保存
按钮,从视觉上看,该按钮从未启用过。否,我说的是输入字段您是否尝试过显式等待和
元素可选择
?然后尝试
sendKeys()
Yes也尝试了,但行为相同。如果此链接用于诊断,是否可以共享该链接。尝试了此操作但没有帮助:(我已对其进行了编辑,以便为每个输入的字符单击“主页”按钮。
WebElement clickableElement = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(visibleElement))
clickableElement.click();
clickableElement.clear();
clickableElement.sendKeys("I am running on linux machine");