При использовании привязок Python Selenium WebDriver click () иногда не работает. - PullRequest
16 голосов
/ 12 января 2012

Я пытаюсь отправить ввод (кнопка type =). Но я не могу обновить значение. Любая помощь приветствуется. Я приложил тестовый пример ниже для вашей справки.

поиск сбоев щелчка здесь

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

Это был витрина для моей работы. Любая помощь приветствуется. Спасибо

Ответы [ 6 ]

15 голосов
/ 13 марта 2012

Можно попробовать заменить .click() на. send_keys("\n"), что эквивалентно «Нажатию клавиши ввода при фокусировке на элемент».

Итак, это:

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

станет таким:

driver.find_element_by_link_text('PurchaseOrder').send_keys("\n")
7 голосов
/ 15 октября 2014

В случае, если это все еще повторяющаяся проблема для кого-либо еще, если вы подтвердили, что ваш код верен (вы проверили его на наличие ошибок и т. Д.), И вы все еще обнаруживаете, что функция find_element_by_...('text').click() не работает должным образом, это часто происходит чтобы ваш код продолжал работать до того, как JavaScript сможет обновить страницу.

Простое решение состоит в том, чтобы import time затем вставить следующий код сразу после любого click() метода:

time.sleep(2) 

Продолжительность таймера сна может быть любой, какой вы выберете. В моем случае я использовал 2 секунды. Надеюсь, это поможет.

3 голосов
/ 21 марта 2012

У меня тоже была эта проблема. Иногда , по какой-то причине вебдрайвер не нажимал кнопку. Ему удалось найти кнопку (она не вызвала исключение NoSuchElementException, и WebDriverWait не помогло).

Проблема, связанная с двойным нажатием кнопки, заключалась в том, что в случае успешного первого щелчка второй произойдет сбой (или нажмите кнопку «Отправить» на следующей странице, если найдено совпадение!). Моя первая попытка заключалась в том, чтобы поместить второй щелчок в блоке «попробовать / исключить» - так я узнал об этом, нажав «Отправить» на следующей странице. XD И это также сильно замедлило мой тест, когда не удалось найти вторую кнопку.

Я нашел несколько хороших идей в Selenium 2.0b3 IE WebDriver, Click not firing . По сути, сначала я нажимаю на родительский элемент, который, похоже, ничего не делает. Затем я нажимаю на кнопку отправки.

0 голосов
/ 03 мая 2018

У меня была та же проблема, когда выпадающее меню из двух частей не могло генерировать то, что должно генерироваться при правильном выборе. Это сработало, когда я импортировал время и использовал time.sleep (2) между двумя щелчками. (Для справки я использовал find_element_by_xpath, чтобы найти измененные параметры.)

0 голосов
/ 12 сентября 2017

Если элемент, по которому вы щелкаете (), является URL-адресом.Я обнаружил, что если взять свойства href и использовать driver.get(elem.get_attribute('href')), то он будет самым чистым.

0 голосов
/ 06 марта 2012

Я бы попробовал другие искатели элементов, такие как className, cssSelector или что-то еще. xPath иногда не выдает ошибки, если элемент не найден. Поэтому сначала начните с выяснения, действительно ли элемент найден веб-драйвером.

Вы также можете попробовать click или использовать другие команды два раза подряд. Это уже решило некоторые из таких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...