wake-up-neo.com

Bei Verwendung von Python-Bindungen funktioniert Selenium WebDriver click () manchmal nicht.

Ich versuche, eine Eingabe zu übermitteln (Typ = Schaltfläche). Ich kann den Wert jedoch nicht aktualisieren. Jede Hilfe wird geschätzt. Ich habe den Testfall unten als Referenz angehängt.

HIER nach CLICK FAILS suchen

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("[email protected]")
            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 __== "__main__":
     unittest.main()

Es war ein Showstopper für meine Arbeit. Jede Hilfe wird geschätzt. Danke

16
senthil3569

Sie können versuchen, .click() durch .send_keys("\n") zu ersetzen. Dies entspricht "Drücken Sie die Eingabetaste, während Sie sich auf ein Element konzentrieren".

Also das:

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

würde dies werden:

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

Falls dies für andere immer noch ein Problem ist, liegt es häufig daran, dass Ihr Code weiterhin korrekt ist (Sie haben ihn auf Fehler usw. überprüft) und die Funktion find_element_by_...('text').click() weiterhin nicht ordnungsgemäß funktioniert Führen Sie den Befehl aus, bevor JavaScript die Seite aktualisieren kann.

Eine einfache Lösung besteht darin, import time und den folgenden Code unmittelbar nach den click()-Methoden einzufügen:

time.sleep(2) 

Die Dauer des Sleep-Timers kann frei gewählt werden. In meinem Fall habe ich 2 Sekunden gebraucht. Hoffentlich hilft das.

7
BCR

Ich hatte auch dieses Problem. Manchmal , aus irgendeinem Grund hat der Web-Treiber nicht auf die Schaltfläche geklickt. Es konnte den Button finden (es hat keine NoSuchElementException ausgelöst und ein WebDriverWait hat nicht geholfen).

Das Problem beim zweimaligen Klicken auf die Schaltfläche bestand darin, dass bei einem erfolgreichen ersten Klick der zweite fehlschlug (oder auf der nächsten Seite auf die Schaltfläche zum Senden klicken, wenn eine Übereinstimmung gefunden wurde!). Mein erster Versuch war, den zweiten Klick in einen try/except-Block zu setzen - so habe ich es herausgefunden, indem ich auf der nächsten Seite auf Submit geklickt habe. XD Und es hat meinen Test auch sehr verlangsamt, als der zweite Knopf nicht gefunden wurde.

Ich habe einige gute Einblicke in Selenium 2.0b3 IE WebDriver, Click not Firing gefunden. Grundsätzlich klicke ich zuerst auf ein übergeordnetes Element, das anscheinend nichts bewirkt. Dann klicke ich auf den Submit-Button.

3
Isaac

Wenn das Element, auf das Sie klicken (), eine URL ist. Ich fand, dass es am saubersten ist, die href-Eigenschaften zu nehmen und driver.get(elem.get_attribute('href')) zu verwenden.

0
MortenB

Ich hatte das gleiche Problem, bei dem eine zweiteilige Dropdown-Menüauswahl nicht das generiert, was sie mit der richtigen Auswahl generieren sollte. Es hat funktioniert, als ich die Zeit importiert habe und time.sleep (2) zwischen den beiden "Klicks" verwendet habe. (Als Referenz habe ich find_element_by_xpath verwendet, um die Optionen zu ändern.)

0
bsvl

Ich würde andere Elementfinder wie className, cssSelector oder so etwas ausprobieren. xPath liefert manchmal keine Fehler, wenn das Element nicht gefunden wird. Beginnen Sie also damit, herauszufinden, ob das Element wirklich vom Webdriver gefunden wird.

Sie können auch versuchen, click oder die anderen Befehle zweimal hintereinander zu verwenden. Dies löste bereits einige dieser Probleme.

0
ctekk