我一直在尝试将文本添加到作为span元素的输入框中。 因此,在阅读了如何做之后。
我开始使用execute_script()
方法。
但即使在那之后什么也没发生。
脚本:
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome(
executable_path='/home/kartikey/Desktop/Files/Text Expansion/chromedriver')
driver.get("https://www.example.com/")
driver.find_element_by_xpath('//*[@id = "email"]').send_keys('***@email')
driver.find_element_by_xpath('//*[@id = "password"]').send_keys('****')
driver.find_element_by_xpath('//*[@id="login"]').click()
# Login Complete
time.sleep(10)
# New Session Clicking
driver.find_element_by_xpath('//*[@id = "x-auto-4"]/tbody/tr[2]/td[2]/em/button').click()
time.sleep(10)
# Click on Easy Search Option
driver.find_element_by_xpath('//*[@id = "menuRoot__menuRoot_menuEasySearch"]/span[3]/span').click()
time.sleep(10)
# Find the span element in which text is edited
df = driver.find_element_by_xpath('//*[contains(@id, "SyntacticField_TAREA")]/div/div[4]/div[1]/div/div/div/div[5]/pre/span')
# Trying to add text into span but FAILS!
driver.execute_script('arguments[0].innerText = "test";', df)
driver.execute_script('arguments[0].click();', df)
time.sleep(15)
# Closing the driver
driver.close()
最后一个XPath
是动态的,这就是为什么我为此使用contains()
方法的原因。
该网页是使用JavaScript生成的,并且span元素的XPath
是:
//*[@id="SyntacticField_TAREA_-1737243078_easySearch"]/div/div[4]/div[1]/div/div/div/div[5]/pre/span
我无法下载代码,因为它是JS生成的,只能通过inspect元素看到。
span元素未显示我尝试添加的任何文本,并且没有任何反应。
答案 0 :(得分:1)
您尝试设置“ .value”而不是innerText吗?这就是我通过javascript更改文本时使用的内容。我也使用单引号而不是双引号,尽管我认为这不会引起任何问题。
arguments[0].value = 'test';
编辑: 我只是意识到我曾发生过几次,如果不发送“ onchange”事件,值将不会更新。这是我使用的完整代码:
public string SetElementValue(IWebElement element, string value)
{
ScrollToElement(element); // Other function that makes sure the element is in view
var exec = (IJavaScriptExecutor)this;
var script = @"
var el = arguments[0];
el.value = '" + value + @"';
try
{
if (""createEvent"" in document) {
var evt = document.createEvent(""HTMLEvents"");
evt.initEvent(""change"", false, true);
el.dispatchEvent(evt);
}
else
el.fireEvent(""onchange"");
}
catch(err){ return err; }
return ""Javascript executed."";
";
var result = exec.ExecuteScript(script, element);
return result.ToString();
}
EDIT2: 我没有任何Python经验,但我想您最终会遇到这样的事情:
script='''var el = arguments[0];
el.value = "' + value + '";
try
{
if (""createEvent"" in document) {
var evt = document.createEvent(""HTMLEvents"");
evt.initEvent(""change"", false, true);
el.dispatchEvent(evt);
}
else
el.fireEvent(""onchange"");
}
catch(err){ return err; }
return ""Javascript executed."";'''
driver.execute_script(script, df)
不确定我的语法是否正确,您可能需要在此处和此处更改一些引号。如果是这种情况,请发布正确的语法,然后我们可以相应地更新答案。
答案 1 :(得分:1)
您可以为此使用Selenium吗?可能还有更多具有相同xpath的元素:
df.send_keys('your text')
检查多少个元素:
df = driver.find_elements_by_xpath('//*[contains(@id, "SyntacticField_TAREA")]/div/div[4]/div[1]/div/div/div/div[5]/pre/span')
print(len(df))
和检查元素是否可见的函数:
def check_if_visible(elements, index=0):
"""
:param elements: driver.find_element_by...
:param index: index of visible elements, it could be the same all time
:return: return index of visible elements
"""
try:
first_visible_elem = 0
last_visible_elem = 0
if index >= 0:
while elements[first_visible_elem].is_displayed() == False:
first_visible_elem = first_visible_elem + 1
index = index + first_visible_elem
else:
while elements[first_visible_elem].is_displayed() == False:
first_visible_elem = first_visible_elem + 1
while elements[first_visible_elem].is_displayed() == True:
last_visible_elem = first_visible_elem
first_visible_elem = first_visible_elem + 1
index = last_visible_elem + 1 + index
except IndexError:
pass
return index
使用方法-其中x是可见元素的索引,如果只有一个可见,它将始终为0:
df = driver.find_elements_by_xpath('//*[contains(@id, "SyntacticField_TAREA")]/div/div[4]/div[1]/div/div/div/div[5]/pre/span')
df[check_if_visible(df, x)].send_keys('your text')