无法找到网页元素
我只想写一个简单的登录脚本苹果网站: Sign In无法找到网页元素
的ID和密码表单无法正确定位。 其实,我尝试了很多的东西,如:
driver.find_element_by_xpath("//*[@type='email']")
或
driver.find_element_by_xpath("//*[@name='login-appleId']")
和
driver.find_element_by_xpath("//*[@id='login-appleId']")
我没有找到这个页面的Iframe。并且我为顾客结帐按钮尝试了同样的事情,同样的问题也发生了。
任何建议将不胜感激!
最佳, 卢克
我建议你尝试以下方法:
driver.find_element_by_id("login-appleId")
driver.find_element_by_id("login-password")
有时WebDriver
存在其中WebElement
没有正确地装上DOM
和webdriver的试图寻找它的场景。所以为了处理这种场景,有WebDriver
库提供的两种类型的等待。
您只需根据您的要求实施其中一项。
我建议你实现其中之一,然后尝试执行脚本。
它并不总是像你期望的那样工作,通常'time.sleep(some_seconds)'已经足够了 – micgeronimo
'time.sleep(some_seconds)'也是有一些缺点。它会阻止您的UI线程获取您在参数中提到的确切时间。可以说你给了等待时间60秒,并且元素在1秒内加载,然后线程停止整个60秒,而隐式等待或显式等待则不是这种情况。 – Paras
您可以按照此代码..它的工作..!
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome('E:\chromedriver.exe') #location
driver.get('url') #https://secure2.store.apple.com/shop/sign_in?c=aHR0cDovL3d3dy5hcHBsZS5jb20vc2hvcC9iYWd8MWFvczVjNGU3ZWNjZjgwODVjNWY4NDk0OTA0ODJhMDc2Y2FkNmU3ODJkOTE&o=O01LV0gy&r=SXYD4UDAPXU7P7KXF&s=aHR0cHM6Ly9zZWN1cmUyLnN0b3JlLmFwcGxlLmNvbS9zaG9wL2NoZWNrb3V0L3N0YXJ0P3BsdG49RkNBRjZGQjR8MWFvczAyZmZkZjQwNTgwOGI4ZTNkMDQ5MWRiM2NmZmExYTgxNzRkZTllMjY&t=SXYD4UDAPXU7P7KXF&up=t
def find_by_xpath(locator):
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, locator))
)
return element
class FormPage(object):
def fill_form(self, data):
find_by_xpath('//input[@name = "login-appleId"]').send_keys(data['usr')
find_by_xpath('//input[@name = "login-password"]').send_keys(data['pwd'])
return self
def submit(self):
find_by_xpath('//input[@id = "sign-in"]').click()
data = {
'usr': '[email protected]',
'pwd': 'xxxx'
}
if __name__=="__main__":
FormPage().fill_form(data).submit()
driver.quit() # closes the webbrowser
希望对你有所帮助 谢谢。!!
问题是,你应该给予足够的时间来加载网页。有一个关于Implisit等待和Explecit等待的理论。试试吧,它需要一些时间来等待元素被加载到浏览器窗口。或者你可以使用Thread.sleep(),这是不推荐的方法。 –
打开页面后试试'time.sleep(few_seconds)',这应该有帮助 – micgeronimo