Python 在Selenium中使用execute_脚本后,span元素中的文本未显示?

Python 在Selenium中使用execute_脚本后,span元素中的文本未显示?,python,selenium,xpath,Python,Selenium,Xpath,我一直在尝试将文本添加到作为span元素的输入框中。 所以,在阅读了如何做到这一点之后 我开始使用execute\u script()方法。 但即使在那之后,什么也没有发生 脚本: 导入时间 从selenium导入webdriver 从selenium.webdriver.common.keys导入密钥 driver=webdriver.Chrome( 可执行文件(路径='/home/kartikey/Desktop/Files/Text Expansion/chromedriver') 驱动程

我一直在尝试将文本添加到作为span元素的输入框中。 所以,在阅读了如何做到这一点之后

我开始使用
execute\u script()
方法。 但即使在那之后,什么也没有发生

脚本:

导入时间
从selenium导入webdriver
从selenium.webdriver.common.keys导入密钥
driver=webdriver.Chrome(
可执行文件(路径='/home/kartikey/Desktop/Files/Text Expansion/chromedriver')
驱动程序。获取(“https://www.example.com/")
驱动程序。通过xpath('/*[@id=“email”]')查找元素。发送密钥('***@email')
驱动程序。通过xpath('/*[@id=“password”]')查找元素。发送密钥('*****')
驱动程序。通过xpath('/*[@id=“login”]')查找元素。单击()
#登录完成
时间。睡眠(10)
#新会话单击
驱动程序。通过xpath('/*[@id=“x-auto-4”]/tbody/tr[2]/td[2]/em/button')查找元素。单击()
时间。睡眠(10)
#点击简易搜索选项
驱动程序。通过xpath('/*[@id=“menuRoot\uuu menuRoot\u menuEasySearch”]/span[3]/span')查找元素。单击()
时间。睡眠(10)
#查找编辑文本的范围元素
df=driver。通过xpath('/*[contains(@id,“SyntacticField\u TAREA”)]/div/div[4]/div[1]/div/div/div/div[5]/pre/span'查找元素
#尝试将文本添加到span中,但失败!
driver.execute_脚本('arguments[0].innerText=“test””,df)
驱动程序。执行_脚本('参数[0]。单击();',df)
时间。睡眠(15)
#关闭驱动程序
驱动程序关闭()
最后一个
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元素没有显示我尝试添加的任何文本,但什么也没有发生。

是否尝试设置“.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();
}
编辑2: 我没有任何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)
不确定语法是否正确,您可能需要在此处或此处更改一些引号。如果是这种情况,请发布正确的语法,然后我们可以相应地更新答案。

您是否尝试设置“.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();
}
编辑2: 我没有任何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)

不确定语法是否正确,您可能需要在此处或此处更改一些引号。如果是这种情况,请发布正确的语法,然后我们可以相应地更新答案。

您可以使用Selenium吗?可能有更多元素使用相同的xpath:

df.发送密钥(“您的文本”)

要检查有多少个元素,请执行以下操作:

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')

你能用硒吗?可能有更多元素使用相同的xpath:

df.发送密钥(“您的文本”)

要检查有多少个元素,请执行以下操作:

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')

这是作为文本编辑器或..的自定义框架吗。。?Span可以保存当前文本,但一些隐藏的输入可以接受键入,具体取决于。但是,将文本直接发送到“innerText”是一种很好的方法,可以在html中搜索一些输入元素,或者为您正在使用的应用程序提供一些信息。当我手动输入文本“random”时,它会添加到范围中。因此,我想将
execute_script
发送到该部分,但它没有任何用处。例如,有一个框架“monaco”编辑器,它也在span中显示文本,但您可以通过控制台ex:monaco editor对象发送文本。。或者将文本发送到隐藏的输入元素。尝试使用浏览器操作发送文本。actions=ActionChains(驱动程序)actions。单击(编辑器元素)actions。发送_键(一些文本)这是作为文本编辑器的自定义框架还是。。?Span可以保存当前文本,但一些隐藏的输入可以接受键入,具体取决于。但是,将文本直接发送到“innerText”是一种很好的方法,可以在html中搜索一些输入元素,或者为您正在使用的应用程序提供一些信息。当我手动输入文本“random”时,它会添加到范围中。因此,我想将
execute_script
发送到该部分,但它没有任何用处。例如,有一个框架“monaco”编辑器,它也在span中显示文本,但您可以通过控制台ex:monaco editor对象发送文本。。或者将文本发送到隐藏的输入元素。尝试使用浏览器操作发送文本。actions=ActionChains(驱动程序)actions。单击(编辑器元素)actions。发送\u键(一些文本)这是
JavaScript
对吗?对于
Python
,你有什么等价物吗?为了更好的布局,我在回答中回答。这是
JavaScript
对吗?对于
Python
,你有什么等价物吗?为了更好的布局,我在答案中回答。再次检查第一行:P你有“driver.find_element”,但应该是“driver.find_elements”来检查它。对于Selenium,一切都不会发生??感谢您的纠正,它返回10个元素,但
XPath
是动态的。该怎么办