我使用Selenium Webdriver和Python自动安排约会。
Webdriver选项:
options = Options()
options.binary_location = '/opt/headless-chromium'
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--single-process')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('/opt/chromedriver',chrome_options=options)
driver.maximize_window()
我能够选择我想要的约会日期,并找到提交按钮。
submit按钮的html(您可以看到data-confirm属性配置的对话框):
<input type="submit" name="commit" value="Reprogramar" id="appointments_submit" data-confirm="{"title":"¿Desea reprogramar esta cita?","ok":"Confirmar","cancel":"Cancelar"}" data-disable-with="Por favor, espere." class="button primary">
我是如何找到它的:
appointments_submit = driver.find_element(By.ID, 'appointments_submit')
appointments_submit.click()
但是,当我点击提交按钮时,它会创建一个确认对话框(直到现在,它才出现在页面的正文中)。无论我尝试了多少,我都无法使Web驱动能够定位这个元素。
元素的Html:
<div class="reveal-overlay" style="display: block;"><div data-reveal="ib04bi-reveal" class="reveal " role="dialog" aria-hidden="false" tabindex="-1" style="display: block; top: 97px;">
<h2 data-confirm-title="" class="h3 text-center alert-icon">¿Desea reprogramar esta cita?</h2>
<p data-confirm-body="" class=""></p>
<div data-confirm-footer="" class="text-center">
<a data-confirm-cancel="" class="button secondary">Cancelar</a>
<a class="button alert">Confirmar</a></div>
<a aria-label="Close modal" class="close-button" data-close="">
<span aria-hidden="true" class="fas fa-times"></span>
</a>
</div></div>
图片:element webdriver cannot locate
这就是失败的地方:
confirmation_button = driver.find_element(By.CSS_SELECTOR, 'body > div.reveal-overlay > div > div > a.button.alert')
confirmation_button .click()
[ERROR] NoSuchElementException: Message: no such element: Unable to locate element:
{
"method": "css selector",
"selector": "body > div.reveal-overlay > div > div > a.button.alert"
}
我也试过WebDriverWait,但也不起作用,因为抛出TimeOutException:
这也没用。
confirmation_button = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "body > div.reveal-overlay > div > div > a.button.alert")))
confirmation_button .click()
请帮助我解决此问题。我觉得自己被困住了。
PD:我正在python3.7 aws lambda函数中运行代码
PD 2:webdrive无法找到的这个对话框元素是网页<body>
的一部分。问题是,只有在点击提交按钮后才会出现。我分享了之前和之后的一些截图。
Before clicking the submit button (only 6 div are showing)
After clicking the submit button (a 7th div appears)
第7个div是webdriver找不到的元素。
1条答案
按热度按时间mtb9vblg1#
我很高兴和尴尬地通知,我能够解决这个问题后一天张贴这个问题。
这个问题是因为我忘记了通过点击它来选择最早的可用日期。这就是为什么单击提交按钮没有打开对话框窗口(因为它被禁用),因此webdriver无法找到它。
我犯了这个错误,因为我在本地测试webscrapping,打开ui,但是当我部署到lambda函数时,我使用了--headless选项。
只有在lambda中,我忘记添加这行代码。