Используя привязки Python, Selenium WebDriver click() иногда не работает.

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

поиск CLICK FAILS ЗДЕСЬ

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

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

Ответы

Ответ 1

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

Итак, это:

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

станет следующим:

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

Ответ 2

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

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

time.sleep(2) 

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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