【发布时间】: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