![](/img/trans.png)
[英]Python Selenium with Salesforce - Cannot Seem to Access Certain Form Elements
[英]Python + Selenium — Cannot access elements on a webpage
我正在尝试访问Selenium中的元素,但是没有一种典型的方法有效。 到目前为止,我已经尝试使用'find_elements_by_x'的每个变体都没有成功。 我也花了大约一天的时间浏览各种论坛,但似乎没有任何效果。 我最近在另一个成功的项目中使用了Selenium,但是对于该特定网站,相同的结构不起作用。 这是包含我要访问的元素的HTML的代码段:
<input type="text" name="username" id="username" placeholder="Username /
Email" autocapitalize="off" autocorrect="off" required="" ng-
model="credentials.username" class="ng-pristine ng-invalid ng-invalid-
required">
显而易见,这是用于登录的用户名输入。下面是我到目前为止尝试过的几行,这些行都没有用。
from selenium import webdriver
driver = webdriver.Chrome("chromedriver.exe filepath")
driver.get('url')
username = driver.find_element_by_xpath('//input[@id="username"]')
如果我使用Chrome中的控制台搜索XPath,则XPath会导航到有问题的元素。
我也尝试过:
username = driver.find_element_by_name('username')
这也没有用。
我对Selenium还是很陌生,并且对HTML完全没有经验,所以我不知道在通过Selenium查找元素时是否必须考虑到HTML中的复杂性。 任何帮助都表示赞赏。 这也是我第一次在这里发布,所以希望我没有违反任何规则。
看起来输入框需要花费几秒钟来加载。 尝试在您的请求之前延迟一下:
driver.implicitly_wait(3)
如果这样不起作用,请一次增加括号中的数字。 如果这样可以解决问题,则可以改为显式等待。
尝试以下代码:
from selenium import webdriver
from selenium.webdriver.support import ui
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
options = Options()
options.add_argument("unlimited-storage")
driver = webdriver.Chrome(chrome_options=options)
driver.get("http://www.runescape.com/companion/comapp.ws")
iframe = ui.WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.TAG_NAME, "iframe")))
# Switch to the frame.
driver.switch_to.frame(iframe)
username = ui.WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "username")))
print(username)
# Switch to the main content.
driver.switch_to.default_content()
driver.quit()
希望对您有帮助!
按照您共享的HTML
, WebElement
是Angular
元素,因此您必须为该元素引入WebDriverWait
,如下所示:
CSS_SELECTOR
:
username = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.ng-pristine.ng-invalid.ng-invalid-required#username")))
XPATH
:
username = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='ng-pristine ng-invalid ng-invalid-required' and @id='username']")))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.