相关的HTML
<div id="datepickerbox" class="ym-gbox-left">
<div class="datepick_label">
<div id="datepicker" class="hasDatepicker">
<div class="ui-datepicker-inline ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all" style="display: block;">
我的代码
self.driver.find_element(By.XPATH('//*[@id="datepicker"]')).click()
dateWidget = self.driver.find_element(By.ID("ui-datepicker-div"))
rows = dateWidget.find_element_by_tag_name("tr")
columns = dateWidget.find_element_by_tag_name("td")
for cell in columns: self.driver.findElement(By.LINK_TEXT("20")).click()
我得到的错误
self.driver.find_element(By.XPATH('//*[@id="datepicker"]')).click()
TypeError: 'str' object is not callable
我该如何做到这一点?
答案 0 :(得分:3)
根据手册的“Location elements” section,By.XPATH
似乎是一个字符串,正确的用法是:
self.driver.find_element(By.XPATH, '//*[@id="datepicker"]')
由于您正在调用By.XPATH
,因此错误消息也是有意义的。 current source也证实了这一点。
不幸的是,Selenium API在不同平台上并不真正一致。您正在使用的语法,调用By.xpath()
由Java使用,而在C#中,您还必须调用By.Xpath()
。因此,当您看到其他被调用的示例时,您会感到困惑,而在Python中,您突然需要通过它。因此,您不应盲目相信您在互联网上找到的示例(如this one),但始终要检查它们是哪种语言。并检查文档和/或疑问来源。
答案 1 :(得分:3)
如果要使用通用find_element()
方法 - 传递两个参数 - By
定位器类型和定位器值:
self.driver.find_element(By.XPATH, '//*[@id="datepicker"]')
尽管如此,使用特定的find_element_by_xpath()
方法会更清晰:
self.driver.find_element_by_xpath('//*[@id="datepicker"]')
而且,在这种情况下更简洁的是使用“by id”定位器:
self.driver.find_element_by_id("datepicker")
答案 2 :(得分:0)
所以我从这个错误中发现,有时网站会加载一个框架,通过打印html - &gt; print(driver.page_source)
会告诉您司机可以&#34;看到&#34;。如果您无法在页面源中找到您的元素,那么就会出现问题。
我通过在框架元素中找到.php链接然后将该链接添加到当前网址来修复此问题,这里有一个示例:给定www.site.com/login
打印页面源,并且,如果这是问题,框架内将会有一个.php链接(例如/loginPage.php
。)点击链接,复制并执行.get([new url])
。这让我看到了一个相同的页面,但您可以像平常一样访问您的html元素!
编辑:感谢Stephen向我展示了第一次添加code
的绳索!