【发布时间】:2018-11-29 23:24:22
【问题描述】:
我对 selenium chromedriver 有疑问,我无法弄清楚是什么原因造成的。几周前一切正常,突然这个错误开始出现。 问题来自以下功能。
def login_(browser):
try:
browser.get("some_url")
# user credentials
user = browser.find_element_by_xpath('//*[@id="username"]')
user.send_keys(config('user'))
password = browser.find_element_by_xpath('//*[@id="password"]')
password.send_keys(config('pass'))
login = browser.find_element_by_xpath('/html/body/div[1]/div/button')
login.send_keys("\n")
time.sleep(1)
sidebar = browser.find_element_by_xpath('//*[@id="sidebar"]/ul/li[1]/a')
sidebar.send_keys("\n")
app_submit = browser.find_element_by_xpath('//*[@id="sidebar"]/ul/li[1]/ul/li[1]/a')
app_submit.send_keys("\n")
except TimeoutException or NoSuchElementException:
raise LoginException
此函数在开发环境(macOS 10.11)下运行没有问题,但在生产环境中抛出如下错误:
Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="sidebar"]/ul/li[1]/a"}
(Session info: headless chrome=67.0.3396.79)
(Driver info: chromedriver=2.40.565383 (76257d1ab79276b2d53ee97XXX),platform=Linux 4.4.0-116-generic x86_64)
我已经在每个环境中更新了 Chrome 和 chromedriver(分别为 v67 和 2.40)。我还给了它更多time.sleep(15)。但问题仍然存在。我最近的猜测是可能是webdriver的初始化没有正常工作:
def initiate_webdriver():
option = webdriver.ChromeOptions()
option.binary_location = config('GOOGLE_CHROME_BIN')
option.add_argument('--disable-gpu')
option.add_argument('window-size=1600,900')
option.add_argument('--no-sandbox')
if not config('DEBUG', cast=bool):
display = Display(visible=0, size=(1600, 900))
display.start()
option.add_argument("--headless")
else:
option.add_argument("--incognito")
return webdriver.Chrome(executable_path=config('CHROMEDRIVER_PATH'), chrome_options=option)
因为,如果Display 不起作用,那么可能没有提到的sidebar 而是其他一些按钮。
所以我的问题是:有人遇到过类似的问题吗?有没有办法知道驱动程序在寻找这样的元素时显示的页面是什么?
【问题讨论】:
-
您可以添加显式或隐式等待加载元素
-
两种环境之间的 HTML 是否可能不同?您是否验证过相同的定位器在两者中都可以手动工作?
-
@JeffC 这个定位器几周前工作正常,html 代码没有改变。
-
@Prany,我不再认为这只是时间问题。增加一些额外的时间并不能解决问题。
-
孩子们,这就是为什么你永远不应该像这样使用 xpath
//*[@id="sidebar"]/ul/li[1]/a。它不会告诉您单击了什么或为什么会失败...没用!同时你有一个a元素,它总是有一个唯一的属性或值来引用。如果没有找到,至少你会知道这不是因为“html结构”
标签: python selenium selenium-webdriver selenium-chromedriver webdriverwait