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

2024-05-20 17:09:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图提交一个输入(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()

它一直是我工作的一大亮点。谢谢你的帮助。谢谢


Tags: selflogidbytimedriverwithdiff
3条回答

您可以尝试用..click()替换send_keys("\n"),这相当于“在聚焦元素时按enter”。

所以这个:

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

会变成这样:

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

如果这对其他人来说仍然是一个重复出现的问题,那么如果您已经确认了代码是正确的(您已经检查过错误等),并且仍然发现find_element_by_...('text').click()函数不能正常工作,这通常是因为您的代码在JavaScript更新页面之前继续运行。

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

time.sleep(2) 

睡眠计时器的持续时间可以是您选择的任何时间。我用了2秒。希望能有所帮助。

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

两次单击按钮的问题是,如果第一次单击成功,第二次单击将失败(或者如果找到匹配项,请单击下一页上的提交按钮!)。我的第一次尝试是将第二次单击放在try/except块中-这就是我在下一页单击submit找到它的方式。XD和它还真的减慢了我的测试时,它找不到第二个按钮。

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

相关问题 更多 >