【问题标题】:Selenium Python 2 find element by name and value?Selenium Python 2 按名称和值查找元素?
【发布时间】:2014-09-19 11:30:14
【问题描述】:

我一直在尝试在网页上定位一个元素,这个元素与其他元素具有相同的名称并且没有 id。它确实有不同的值,所以我想通过名称和值来查找元素。

在我的网页中,我有一个搜索按钮:

<input name="action" value=" Search " style=" border-style2;  font-size: 11;
                     font-family: arial, helvetica" border="0" type="submit">

我不能使用名称,因为我有另一个具有相同名称和类型的元素:

<input name="action" value=" Go " onclick=" return custRange('cust', 'd_custno');"
                     style=" border-style2;  font-size: 11; font-family: arial, helvetica"
                     border="0" type="submit">

因此我尝试使用 xpath,我首先使用 xpath 检查器返回返回的 xpath:

/x:html/x:body/x:center/x:table/x:tbody/x:tr/x:td/x:center/x:center[1]/x:table[2]/x:tbody/x:tr/x:td[1]/x:table[3]/x:tbody/x:tr[5]/x:td[2]/x:input[2]

再次对此很新,但我假设“x:”不应该在路径中,所以我删除了它并尝试找到具有以下内容的元素:

search = driver.find_element_by_xpath("//center[1]/table[2]/tbody/tr/td[1]/table[3]/tbody/tr[5]/td[2]/input[2]")
search.clickAndWait()

导致:

selenium.common.exceptions.NoSuchElementException: Message: 'Unable to find element with xpath == //center[1]/table[2]/tbody/tr/td[1]/table[3]/tbody/tr[5]/td[2]/input[2]'

所以我真的有 2 个问题,如果有人可以提供帮助,那就太好了:

  1. 有没有办法通过名称和值来识别元素?
  2. 显然我在 xpath 中遗漏了一些东西,我尝试使用 xpath 的方式不正确吗?如果是这样,你能建议我做错了什么吗?

非常感谢任何帮助。

为了完整起见,我的单元测试代码如下:

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

class umLoginTest(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Ie()
        self.driver.implicitly_wait(3)

    def test_login_to_um(self):
        driver = self.driver
        result_file = open("umLoginTest_result.txt", "w")
        driver.get("http://ps-iweb/UserManage/Home")
        self.assertIn("Welcome", driver.title)
        elem = driver.find_element_by_name("userLogin")
        elem.send_keys("pstevenson")
        password = driver.find_element_by_name("sec_password")
        password.send_keys("etc")
        password.send_keys(Keys.RETURN)
        test1 = driver.title
        result_file.write(str(test1))
        select = driver.find_element_by_name("conn_marketid")
        for option in select.find_elements_by_tag_name('option'):
            if option.text == 'Int Rate Swaps':
                option.click()
        search = driver.find_element_by_xpath("//center[1]/table[2]/tbody/tr/td[1]/table[3]/tbody/tr[5]/td[2]/input[2]")
        search.clickAndWait()

        result_file.close()

if __name__ == "__main__":
    unittest.main()

【问题讨论】:

标签: python selenium python-3.x selenium-webdriver


【解决方案1】:

试试这个

//input[@name='action' and @value=' Search ']

【讨论】:

  • 虽然这段代码可以回答问题,但最好解释一下如何解决问题,并提供代码作为示例或参考。仅代码的答案可能会令人困惑且缺乏上下文。
【解决方案2】:

回答您的问题,

1 - 是的,你可以,

driver.find_element_by_name(‘foo’)

http://selenium-python.readthedocs.org/en/latest/api.html#selenium.webdriver.remote.webdriver.WebDriver.find_element_by_name

2 - 我总是尽量避免使用 xpath,因为有时它不能正常工作。相反,您应该始终尝试按名称或 id 查找。我认为这是最好的情况。

【讨论】:

  • 谢谢,不幸的是 find_element_by_name 不起作用,因为有 2 个元素具有相同的名称。 webdriver 只选择第一个。所以我真的很想知道我是否可以通过名称和值找到元素,因为这是我想要获取的元素的独特部分。
  • 所以,你应该使用find_elements_by_name(你可以找到所有元素)
【解决方案3】:

以下是 Java 代码,我使用上面指定的 2 个控件进行了尝试。

driver= new FirefoxDriver();
driver.get("file:///D:/Programming%20Samples/Input.html");
driver.findElement(By.xpath("//*[@name='action'][@value='Go']")).click();
driver.findElement(By.xpath("//*[@name='action'][@value='Search']")).click();  //observed here in your HTML i see some spaces. Make sure giving the right value.

希望以上有所帮助。

【讨论】:

    【解决方案4】:
    driver.find_element_by_xpath("//*[@value=' Search ']").click()
    

    肯定会有帮助。

    【讨论】:

    • 虽然这段代码可以回答问题,但最好解释一下如何解决问题,并提供代码作为示例或参考。仅代码的答案可能会令人困惑且缺乏上下文。
    猜你喜欢
    • 2016-06-08
    • 2018-10-12
    • 2018-12-06
    • 1970-01-01
    • 2011-08-15
    • 2015-07-12
    • 2021-08-13
    • 2021-03-05
    • 2023-01-03
    相关资源
    最近更新 更多