web-dev-qa-db-ja.com

Pythonバインディングを使用すると、Selenium WebDriver click()が機能しない場合があります。

入力(type =ボタン)を送信しようとしていますが、値を更新できません。どんな助けでも大歓迎です。参考までに、以下のテストケースを添付しました。

CLICK FAILS HEREを検索

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 __name__ == "__main__":
     unittest.main()

それは私の仕事の目玉でした。どんな助けでも大歓迎です。ありがとう

16
senthil3569

.click()を.send_keys("\n")に置き換えてみることができます。これは、「要素に焦点を合わせながらEnterキーを押す」と同じです。

したがって、この:

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

これになります:

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

これが他の人にとってまだ繰り返し発生する問題である場合、コードが正しいことを確認し(エラーなどを確認した)、それでもfind_element_by_...('text').click()関数が正しく機能していないことがわかった場合は、多くの場合、 JavaScriptがページを更新する前にコードが実行され続けるため、.

簡単な解決策は、_import time_を実行し、click()メソッドの直後に以下のコードを挿入することです。

_time.sleep(2) 
_

スリープタイマーの持続時間は、選択したものであれば何でもかまいません。私の場合、2秒を使用しました。うまくいけば、それが役立つでしょう。

8
BCR

私もこの問題を抱えていました。 時々、何らかの理由でWebドライバーがボタンをクリックしませんでした。ボタンを見つけることができました(NoSuchElementExceptionをスローせず、WebDriverWaitは役に立ちませんでした)。

ボタンを2回クリックする際の問題は、最初のクリックが成功した場合、2番目のクリックが失敗することでした(または、一致するものが見つかった場合は、次のページの送信ボタンをクリックしてください!)。私の最初の試みは、2回目のクリックをtry/exceptブロックに入れることでした。これが次のページの[送信]をクリックしてそれを見つけた方法です。 XDまた、2番目のボタンが見つからなかった場合、テストの速度が大幅に低下しました。

Selenium 2.0b3 IE WebDriver、Click not fireing でいくつかの良い洞察を見つけました。基本的に、最初に親要素をクリックしますが、何もしないようです。次にクリックします。送信ボタンで。

3
Isaac

Click()する要素がURLの場合。 hrefプロパティを取得し、driver.get(elem.get_attribute('href'))を使用するのが最もクリーンであることがわかりました。

0
MortenB

2つの部分からなるドロップダウンメニューを選択しても、適切な選択で生成されるはずのものが生成されないという同じ問題がありました。時間をインポートし、2つの「クリック」の間にtime.sleep(2)を使用すると機能しました。 (参考までに、find_element_by_xpathを使用してオプションの変更を見つけました。)

0
bsvl

classNamecssSelectorなどの他の要素ファインダーを試してみます。要素が見つからない場合、xPathがエラーを提供しないことがあります。したがって、最初に、要素がWebdriverによって実際に検出されたかどうかを確認することから始めます。

clickを試すか、他のコマンドを使用することもできます2回連続して。これはすでにそのような問題のいくつかを解決しました。

0
ctekk