使用Python绑定,Selenium WebDriver click()有时不起作用。

时间:2012-01-12 09:40:30

标签: python selenium webdriver selenium-webdriver

我正在尝试提交输入(type = button)。但是我无法更新该值。 任何帮助表示赞赏。 我已附上下面的测试用例供您参考。

在此处搜索点击失败

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
import unittest, time, re,datetime,os,sys

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains


def is_element_present(inst,selector,value):
    try:
        inst.find_element(by=selector, value=value)
        return True
    except:
        return False



class Testing(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(5)
        self.base_url = "http://new.ossmoketest.appspot.com/"
        self.verificationErrors = []

    def test_ing(self):
        try:

            driver = self.driver
            driver.get(self.base_url + "/Apab4b39d4_09d7_11e1_8df9_139372201eeb/1/signin?forward=/%3F")
            now = datetime.datetime.now()
            start = time.clock()

            for i in range(5000000):
                try:
                    if is_element_present(driver,By.ID,"userid"): break
                except: pass
            else: self.fail("time out")
            end = time.clock()
            diff = end - start
            print diff
            driver.find_element_by_id("userid").clear()
            driver.find_element_by_id("userid").send_keys("senthil.arumugam@orangescape.com")
            driver.find_element_by_xpath("//input[@src='/static/images/signup.png']").click()
            print 'finished'
            start = time.clock()

            for i in range(5000000):
                try:
                    if is_element_present(driver,By.LINK_TEXT,"Logout"): break
                except: pass
            else: self.fail("time out")
            end = time.clock()
            diff = end - start
            print diff
            time.sleep(5)

            start = time.clock()
            name = "smoketest"+ str(now.minute) +str(now.second)
            for i in range(5000000):
                try:
                    if is_element_present(driver,By.LINK_TEXT,"PurchaseOrder"): break
                except: pass
            else: self.fail("time out")
            end = time.clock()
            diff = end - start
            driver.find_element_by_link_text('PurchaseOrder').click()
            name = "smoketest"+ str(now.minute) +str(now.second)
            start = time.clock()
            for i in range(5000000):
                try:
                    if is_element_present(driver,By.ID,"Customer_Name"): break
                except: pass
            else: self.fail("time out")
            end = time.clock()
            diff = end - start

            newproduct = "rexona"+ str(now.minute) +str(now.second)
            newprice = str(now.minute) +str(now.second)
            newprice = float(newprice)
            print newprice
            driver.find_element_by_xpath("//input[starts-with(@id,'New_Product')]").send_keys(newproduct)
            driver.find_element_by_xpath("//input[starts-with(@id,'Price')]").clear()
            time.sleep(3)

            driver.find_element_by_xpath("//input[starts-with(@id,'Price')]").send_keys(Keys.CONTROL+'a'+Keys.NULL, str(newprice))
            Mouse_cntrl = ActionChains(driver)
            Mouse_cntrl.release(driver.find_element_by_xpath("//input[starts-with(@id,'Price')]"))
            value = newprice
            print value
            time.sleep(2)
            print 'start'
            print driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]").get_attribute('data-id')
            # ------------------------CLICK FAILS HERE ------------------------------
#            driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]").click()
#            driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]").submit()
            driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]").send_keys(keys.ENTER)
#            Mouse_cntrl.double_click(driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]"))
            for i in range(10):
                try:
                    print driver.switch_to_alert().text
                    if driver.switch_to_alert():
                        driver.switch_to_alert().accept()
                        break
                except: pass
                time.sleep(1)
            else:
                print "alert not found"
            print 'finished  -- '
            time.sleep(8)
            driver.find_element_by_xpath("//input[starts-with(@id,'Product')]").click()
            arg = newproduct
            print 'end'
            for i in range(60):
                try:
                    if is_element_present(driver,By.LINK_TEXT,arg): break
                except: pass
                time.sleep(1)
            else: self.fail("time out")
    #        sel.mouse_over("//html/body/ul/li/a[.=\""+arg+"\"]")
            driver.find_element_by_link_text(arg).click()
            start = time.clock()
            time.sleep(25)
            for i in range(1000000):
                try:

                    if newprice == float(driver.find_element_by_id('Unit_Price').text):
                        end = time.clock()
                        diff = end - start
                        log.log(module='Smoke',testcase='Action New', result='Pass',time_taken= diff)
                        break
                except: pass
            else:
                log.log(module='Smoke',testcase='Action New', result='Fail')
                self.fail('New Failure')
            log.log(module='Smoke',testcase='On Submit', result='Pass',time_taken= diff)
            driver.find_element_by_id('Quantity').send_keys(Keys.CONTROL+'a'+Keys.NULL,"1")
            time.sleep(5)
            start = time.clock()
            for i in range(1000000):
                try:
                    if value == float(driver.find_element_by_id('Unit_Price').text):
                        end = time.clock()
                        diff = end - start
                        log.log(module='Smoke',testcase='Multiply', result='Pass',time_taken= diff)
                        break
                except: pass
            else: self.fail("time out")
            for i in range(1000000):
                try:
                    if value == float(driver.find_element_by_id('Amount').text):
                        end = time.clock()
                        diff = end - start
                        log.log(module='Smoke',testcase='DSUM with Parent', result='Pass',time_taken= diff)
                        break
                except: pass
            else:
                end = time.clock()
                diff = end - start
                log.log(module='Smoke',testcase='DSUM with Parent', result='Fail',time_taken= diff)
                self.fail("time out")

        except:
            self.driver.quit()
            e = sys.exc_info()[1]
            print str(e)

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

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

这是我工作的一个障碍。感谢任何帮助。谢谢

8 个答案:

答案 0 :(得分:15)

您可以尝试将.click()替换为。send_keys("\n"),这相当于“在关注元素时按Enter键”。

所以这个:

driver.find_element_by_link_text('PurchaseOrder').click()

会变成这样:

driver.find_element_by_link_text('PurchaseOrder').send_keys("\n")

答案 1 :(得分:7)

如果这仍然是其他任何人反复出现的问题,如果您确认您的代码是正确的(您已经检查过它是否有错误等),您仍然发现find_element_by_...('text').click()功能无法正常工作这通常是由于您的代码在JavaScript可以更新页面之前继续运行。

一个简单的解决方案是import time然后在任何click()方法之后立即插入以下代码:

time.sleep(2) 

睡眠定时器的持续时间可以是您选择的任何内容。在我的情况下,我用了2秒。希望这会有所帮助。

答案 2 :(得分:3)

我也有这个问题。 有时,无论出于何种原因,webdriver都没有点击按钮。它能够找到按钮(它没有抛出NoSuchElementException而WebDriverWait没有帮助)。

单击按钮两次的问题是,如果第一次单击成功,则第二次单击将失败(或者如果找到匹配则单击下一页上的提交按钮!)。我的第一次尝试是将第二次点击放在try / except块中 - 这就是我在下一页点击提交时发现的。 XD当它找不到第二个按钮时,它确实减慢了我的测试速度。

我在Selenium 2.0b3 IE WebDriver, Click not firing找到了一些很好的见解。基本上,我先点击一个父元素,这似乎什么也没做。然后我点击提交按钮。

答案 3 :(得分:0)

我会尝试其他元素查找器,例如classNamecssSelector或其他东西。如果找不到元素,xPath有时不会提供错误。 首先,首先找出webdriver是否真的找到了该元素。

您也可以尝试click或连续使用其他命令两次。这已经解决了一些这样的问题。

答案 4 :(得分:0)

如果您点击的元素()是网址。我发现采用href属性并使用driver.get(elem.get_attribute('href'))是最干净的。

答案 5 :(得分:0)

我遇到了同样的问题,即两部分下拉菜单选择不会产生它应该通过适当选择产生的内容。当我输入时间并在两个"点击" s之间使用time.sleep(2)时它起作用了。 (作为参考,我使用find_element_by_xpath来查找修改选项。)

答案 6 :(得分:0)

我遇到了以上问题,其中相同的.click()在所有浏览器(IE,Chrome和Firefox)中均有效,但不适用于Safari。所以我尝试了这篇文章中所有可能的解决方案,但都没有用,甚至都没有抛出错误。

下面我尝试用.submit()替换.click(),这是一种等效方法,它不仅适用于Safari,而且适用于所有其他浏览器。

所以这个:

driver.find_element_by_id('login_btn').click()

替换为:

driver.find_element_by_id('login_btn').submit()

如果以上由于任何原因在其他浏览器上均无法正常运行,请在.try和except中保留.submit()。如果失败,将触发并执行click()。

希望这对其他解决方案均无效的情况会有所帮助。

答案 7 :(得分:0)

对于那些 click() 不起作用的人,如果该按钮元素(可点击元素)在表单元素中,请使用 submit()。基本上,为了提交表单,我们需要使用 submit(),click() 在某些情况下不起作用。