【问题标题】:Switching Screens with Try and Except statements Python Kivy Selenium使用 Try 和 except 语句切换屏幕 Python Kivy Selenium
【发布时间】:2021-01-01 21:27:34
【问题描述】:

我正在为需要在页面中唱歌的网络抓取工具(Selenium 和 Kivy)制作 GUI。有时它会说要验证您的帐户,理论上,如果 selenium 驱动程序找到特定于该页面的元素,它应该切换屏幕(尝试和除外)。如果它没有找到该元素,它应该添加一条错误消息。但是,这不会切换屏幕,它会停留在第一个屏幕上。我已经对此进行了一段时间的故障排除,但我不确定问题是什么。当 Selenium 驱动程序找到该元素时,它会运行该 try 语句中的代码。如果没有,则不会添加错误消息。

这是我的python代码:

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
from kivy.config import Config
import linkedenInfo
from linkedenInfo import *
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition

Config.set('graphics', 'resizable', True)
Fl = FloatLayout()

#---
class SignInScreen(Screen):
    email = ObjectProperty(None)
    pwd = ObjectProperty(None)

    def sign_in(self):

        user = UsDefined()

        errMsg = Label(text="Incorrect Username or Passoword!\nPlease Try again", size_hint=(.5, 0.05),
                       pos_hint={'top': 0.6, 'center_x': 0.5})
        try:
            user.sign_in(self.email.text, self.pwd.text)
            driver.find_element_by_xpath('//*[@id="global-nav"]')
        except NoSuchElementException:
            try:
                driver.find_element_by_xpath('//*[@id="app__container"]/main/h1')
                LinkedInGui.screen_switch_one(None)

            except NoSuchElementException:
                self.email.text = ""
                self.pwd.text = ""
                Fl.add_widget(errMsg)
#----



class VerifScreen(Screen):
    verifInput = ObjectProperty(None)

class ScreenMang(ScreenManager):
    pass

kv = Builder.load_file("appFormatting.kv")

sm = ScreenManager()
sm.add_widget(VerifScreen(name="_VerifScreen_"))

class LinkedInGui(App):
    def build(self):
        return kv

    def screen_switch_one(self):
        print("Hello 2!")
        sm.current_screen = "_VerifScreen_"



    # run the App


if __name__ == "__main__":
    LinkedInGui().run()

这是我的 KV 文件:


ScreenMang:
    SignInScreen:
    VerifScreen:


<SignInScreen>
    name: "Sign-In"

    email: userEmail
    pwd: password

    FloatLayout:
        Label:
            text:"LinkedIn Web-Scraper"
            size_hint:(.5, 0.05)
            pos_hint:{'top': 0.975, 'center_x': 0.5}

        TextInput:
            id: userEmail
            hint_text:"LinkedIn Email: "
            size_hint:(.5, 0.05)
            pos_hint:{'center_x': 0.5, 'y': .85}
            multiline:False

        TextInput:
            id: password
            hint_text:"LinkedIn Password: "
            size_hint:(.5, 0.05)
            pos_hint:{'center_x': 0.5, 'y': .8}
            multiline:False
            password:True

        Button:
            text:"Sign-In"
            size_hint:(.5, 0.1)
            pos_hint:{'top': 0.76, 'center_x': .5}
            on_release:
                root.sign_in()


<VerifScreen>
    name: "_VerifScreen_"

    verifInput: verifInput

    FloatLayout:
        Label:
            text: "An SMS text message was sent to your phone number.\nEnter the code below."
            size_hint: (.5, 0.05)
            pos_hint: {'top': 0.79, 'center_x': 0.5}

        TextInput:
            id: verifInput
            hint_text: "Verification Code"
            size_hint: (.5, 0.05)
            pos_hint: {'top': 0.73, 'center_x': 0.5}

        Button:
            text:"Verify"
            size_hint:(.5, 0.1)
            pos_hint:{'top': 0.6, 'center_x': .5}
#            on_release:
#                root.sign_in()

这是我的 Selenium 代码:​​

class UsDefined():

    def sign_in(self, usname, pwd):
        url = 'https://www.linkedin.com/uas/login?session_redirect=https%3A%2F%2Fwww%' \
              '2Elinkedin%2Ecom%2Fsearch%2Fresults%2Fpeople%2F%3Forigin%3DDISCOVER_FROM_' \
              'SEARCH_HOME&fromSignIn=true&trk=cold_join_sign_in'
        driver.get(url)
        driver.find_element_by_id("username").clear()
        driver.find_element_by_id("username").send_keys(usname)
        driver.find_element_by_id("password").clear()
        driver.find_element_by_id("password").send_keys(pwd) 
        driver.find_element_by_id("password").send_keys(Keys.RETURN)

    def verif_code(self, verifNum):
        verifText = driver.find_element_by_xpath('//*[@id="app__container"]/main/h1').text
        driver.find_element_by_xpath('//*[@id="input__phone_verification_pin"]').send_keys(verifNum)
        driver.find_element_by_xpath('//*[@id="input__phone_verification_pin"]').send_keys(Keys.RETURN)

为什么我不能通过 python 代码切换屏幕?我会在 KV 文件中编写 try 和 except 语句,但这是不可能的。

【问题讨论】:

    标签: python selenium selenium-chromedriver kivy kivy-language


    【解决方案1】:

    您是否尝试在没有“NoSuchElementException”的情况下运行它?

    只是一个“例外:”

        try:
            user.sign_in(self.email.text, self.pwd.text)
            driver.find_element_by_xpath('//*[@id="global-nav"]')
        except:
            try:
                driver.find_element_by_xpath('//*[@id="app__container"]/main/h1')
                LinkedInGui.screen_switch_one(None)
    
            except:
                self.email.text = ""
                self.pwd.text = ""
                Fl.add_widget(errMsg)
    

    不是最好的方法,但您可以隔离错误。

    【讨论】:

    • 不幸的是结果相同
    • 是KV文件有问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2020-02-25
    相关资源
    最近更新 更多