获取WebElement的javascript选择器

获取WebElement的javascript选择器,javascript,python,selenium-webdriver,Javascript,Python,Selenium Webdriver,因此,我有一个类,它包装了一个WebElement,并添加了一些功能,使它在我的页面对象中更有用。我现在需要设置文本输入的文本,我能看到的唯一方法是注入javascript来查找元素并设置其value属性 对于我有一个id的简单情况,这是相当简单的,但是如果有动态生成的表单,可能没有一个有用的id,其中一些可以通过查找封闭表单,然后在其中查找css选择器来找到,在其他表单中存在与相同css选择器匹配的其他输入 我可以通过xpath查找所有内容来解决这个问题,但是必须有一个不那么脆弱/破坏性的解决

因此,我有一个类,它包装了一个WebElement,并添加了一些功能,使它在我的页面对象中更有用。我现在需要设置文本输入的文本,我能看到的唯一方法是注入javascript来查找元素并设置其value属性

对于我有一个id的简单情况,这是相当简单的,但是如果有动态生成的表单,可能没有一个有用的id,其中一些可以通过查找封闭表单,然后在其中查找css选择器来找到,在其他表单中存在与相同css选择器匹配的其他输入


我可以通过xpath查找所有内容来解决这个问题,但是必须有一个不那么脆弱/破坏性的解决方案。我知道您可以从Javascript执行器中获取WebElement,我想知道的是,是否可以将Javascript对象引用注入到给定的WebElement中,如果不可以,是否可以在运行时从现有WebElement获取唯一的xpath

我正在使用python,但其他语言的解决方案可能是可移植的


编辑 我知道某个地方有一个webdriver元素缓存,我可以在该缓存中获取元素的id:


有没有办法在注入的javascript中使用它?

如果我正确理解了您的问题,您会问如何将Selenium WebElement对象传递给javascript。如果正在测试的页面正在使用jQuery,则可能如下所示:

# select the element in python
form1 = driver.find_element_by_id('id_of_the_form')

# execute javascript which references the object
execute_script("$(arguments[0]).find('input.childOfInterest').val('newValue')", form1)
由于
execute\u script()
接受一个字符串(要执行的JS)和一个可选的第二个参数(对象引用),因此您可以使用
参数[0]
引用该对象(本例中是一个WebElement)。在本例中,我传入父表单元素,然后使用jQuery选择表单,使其成为jQuery对象,然后调用jQuery的
.find()
关闭该对象,传入css选择器以定位子元素,然后调用jQuery的
.val()
关闭该对象以更新元素的值


您还询问了如何在运行时生成xpath。 下面是一个例子(完整答案):


如果我正确理解了您的问题,那么您正在询问如何将Selenium WebElement对象传递给JavaScript。如果正在测试的页面正在使用jQuery,则可能如下所示:

# select the element in python
form1 = driver.find_element_by_id('id_of_the_form')

# execute javascript which references the object
execute_script("$(arguments[0]).find('input.childOfInterest').val('newValue')", form1)
由于
execute\u script()
接受一个字符串(要执行的JS)和一个可选的第二个参数(对象引用),因此您可以使用
参数[0]
引用该对象(本例中是一个WebElement)。在本例中,我传入父表单元素,然后使用jQuery选择表单,使其成为jQuery对象,然后调用jQuery的
.find()
关闭该对象,传入css选择器以定位子元素,然后调用jQuery的
.val()
关闭该对象以更新元素的值


您还询问了如何在运行时生成xpath。 下面是一个例子(完整答案):


“在运行时从现有WebElement获取唯一的xpath”是不可能的-给定元素没有唯一的xpath,它们肯定远远不止一个,并且可能会匹配多个元素。@furins如果所有其他元素都失败,在运行时,您可以给出文档根元素的完整路径,如果任何元素具有相同元素类型的多个子元素,您可以给出一个索引号?那时,xpath对于该web元素是唯一的。我不在乎DOM是否在两秒钟后发生变化,我只关心能够在我正在寻找某个元素的时候准确地对其进行操作。也许我不太理解你的问题:如果你有一个包装WebElement的类,为什么不简单地使用该类的
send\u keys
(文档:)?@furins,因为输入是禁用的,通常会通过文件选择对话框进行设置,但是这会从页面中获取焦点并中断测试。现在我更好地理解了它。我不知道如何实现您想要的行为,除了根据它的(默认)值和状态唯一地识别它,最终检查下一个同级元素的属性,最后在javascript循环中使用第n个元素选择器“在运行时从现有WebElement获取唯一的xpath”不可能-给定元素没有唯一的xpath,它们肯定远远不止一个,并且可能匹配不止一个元素。@furins如果所有其他元素都失败,在运行时,您可以给出文档根元素的完整路径,如果任何元素具有相同元素类型的多个子元素,您可以给出一个索引号?那时,xpath对于该web元素是唯一的。我不在乎DOM是否在两秒钟后发生变化,我只关心能够在我正在寻找某个元素的时候准确地对其进行操作。也许我不太理解你的问题:如果你有一个包装WebElement的类,为什么不简单地使用该类的
send\u keys
(文档:)?@furins,因为输入是禁用的,通常会通过文件选择对话框进行设置,但是这会从页面中获取焦点并中断测试。现在我更好地理解了它。我不知道如何实现您想要的行为,除了根据它的(默认)值和状态唯一地识别它,最终检查下一个同级元素的属性,最后在javascript循环中使用第n个元素选择器之外
# define xpath generation JS in python
xpathJS = "function getPathTo(element){ if(element....."

# add new function to the page
execute_script(xpathJS)

# select an element with SE
element1 = driver.find_element_by_id('id_of_element')

# get the xpath of the element
xpath1 = execute_script("return getPathTo(arguments[0])", element1)