Selenium Python 2按名称和值查找元素?

时间:2014-07-28 09:44:59

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

我一直在尝试在网页上找到一个元素,这个元素与其他元素同名,没有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]'

所以我真的有两个问题,如果有人可以提供帮助,那将会很棒:

  1. 有没有办法按名称和价值来识别元素?
  2. 显然我错过了一些xpath,是我试图使用xpath不正确的方式?如果是这样你能表明我做错了吗?
  3. 任何帮助非常感谢。

    为了完整性,我的unittest代码如下:

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

4 个答案:

答案 0 :(得分:8)

试试这个

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

答案 1 :(得分:3)

回答你的问题,

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,因为有时它不能正常工作。相反,你应该总是试图通过名字或身份来查找..我认为这是最好的情况。

答案 2 :(得分: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.

希望以上有所帮助。

答案 3 :(得分:0)

operator.attrgetter

一定会有所帮助。