python – 使用selenium替换textarea中的字符串,“无法通过键盘访问”

我想用Selenium修改textarea中的部分文本. textarea似乎几乎就像是只读的.

在这个使用示例算法的非常简单的示例中,能够更改此行上的库存ID会很棒:

context.aapl = sid(24)

……对于这样的事情:

context.aapl = sid(39840)

…这是特斯拉股票ID.变量名将不再有意义,无所谓,只是一个开始.

这个Selenium代码可以打开样本而无需登录.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

t = webdriver.Firefox()     # t stands for tab as in browser tab in my mind
t.implicitly_wait(10)
t.get('https://www.quantopian.com/algorithms/')
o = t.find_element_by_xpath("//body")       # o stands for object
o.send_keys(Keys.ESCAPE)                    # clearing the popup
o = t.find_element_by_link_text("Hello World Algorithm")
o.click()
''' for the fun of it if you want to run the backtest
o = t.find_element_by_xpath('//body')
o.send_keys(Keys.CONTROL + 'b')
o.send_keys(Keys.ESCAPE)
'''
print t.find_element_by_id('code-area').text

这是输出

1
# Called once at the start of the simulation.
2
def initialize(context):
3
    # Reference to the AAPL security.
4
    context.aapl = sid(24)
5
6
    # Rebalance every day, one hour and a half after market open.
7
    schedule_function(my_rebalance,
8
        date_rules.every_day(),
9
        time_rules.market_open(hours=1, minutes=30))
10
11
# This function was scheduled to run once per day at 11AM ET.
12
def my_rebalance(context, data):
13
    14
    # Take a 100% long position in AAPL. Readjusts each day to
15
    # account for price fluctuations.
16
    if data.can_trade(context.aapl):
17
        order_target_percent(context.aapl, 1.00)

那个id是’代码区’.内容包括可能存在问题的保证金编号.
下一个嵌套区域是’code-area-internal’,看起来是一样的.
其次是这两个.

<div class='ide-container' id='ide-container'>
<textarea class='width_100pct' id='codebox'>

在尝试使用’codebox’获取算法的内容时,内容似乎不存在,只是你’…

>>> p = t.find_element_by_id('codebox').text
>>> p
u''

尝试对其执行CTRL-A会导致此异常…

>>> o = t.find_element_by_id('codebox')
>>> o.send_keys(Keys.CONTROL + 'a')

ElementNotInteractableException:消息:键盘无法访问元素

如果文本可以完全剪切,那么替换可以在Python和粘贴中完成,这样就可以了.
我不希望Selenium能够找到并替换文本,只是惊讶地发现用户输入的可见区域不受交互性限制.

textarea确实拥有自己的Find,并希望不必尝试将其用作解决方法.

(环境是称为Quantopian的股票市场算法的在线IDE)

这是我尝试过的另一件事,没有明显效果:

>>> t.execute_script("arguments[0].value = arguments[1]", t.find_element_by_id("ide-container"), "_new_")

感谢任何指针.

最佳答案 Textarea具有style =“display:none”属性,这意味着您无法使用text属性获取其内容.在这种情况下,您可以使用:

p = t.find_element_by_id('codebox').get_attribute("textContent")

要为代码字段设置新值,您可以使用:

field = driver.find_element_by_css_selector('div[role="presentation"]')
driver.execute_script("arguments[0].textContent = 'New value';", field)

但请注意,最初代码字段中的每个代码行都显示为具有特定值和样式的单独div节点.因此,为了使新值看起来与代码完全相同(在相同格式中),您可以准备HTML样本,例如

value = """<div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -48px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 15px; width: 21px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment"># Comment for new code.</span></span></pre></div>"""

并做

driver.execute_script("arguments[0].innerHTML = arguments[1];", field, value)
点赞