Selenium正在返回PageSource的旧状态,并且在Javascript执行之后没有更新



我在C#中有一个控制台程序,Selenium控制着一个Chrome浏览器实例,我想从一个页面中获取所有链接。

但在页面加载到Selenium后,Selenium的PageSource与我导航到的网站的HTML不同。页面的内容由JavaScript异步加载,HTML也发生了变化。

即使我像下面这样加载网站的HTML,HTML仍然与Selenium控制的浏览器窗口中的HTML不同:

var html = ((IJavaScriptExecutor)driver).ExecuteScript("return document.getElementsByTagName('html')[0].outerHTML").ToString();

但是,为什么JS返回的PageSource或HTML仍然和Selenium加载页面时一样?



编辑:正如@BinaryBob所指出的,我现在已经实现了一个等待函数,以等待所需的元素更改特定的属性值。代码如下:

private static void AttributeIsNotEmpty(IWebDriver driver, By locator, string attribute, int secondsToWait = 60)
{
new WebDriverWait(driver, new TimeSpan(0, 0, secondsToWait)).Until(d => IsAttributeEmpty(d, locator, attribute));
}
private static bool IsAttributeEmpty(IWebDriver driver, By locator, string attribute)
{
Console.WriteLine("Output: " + driver.FindElement(locator).GetAttribute(attribute));
return !string.IsNullOrEmpty(driver.FindElement(locator).GetAttribute(attribute));
}

函数调用如下所示:

AttributeIsNotEmpty(driver, By.XPath("/html/body/div[2]/c-wiz/div[4]/div[1]/div/div/div/div/div[1]/div[1]/div[1]/a[1]"), "href");

但是这个条件永远不会满足,并且会抛出超时。但在Chrome浏览器(由Selenium控制(中,条件得到满足,并且元素有一个填充的href属性。

我正在尝试一下。你在叫等等吗。直到(ExpectedConditions…(出现在代码中?如果不是,那可能就是问题所在。FindElement方法已返回并不意味着页面已完成呈现。

举个简单的例子,这段代码来自Seleniumdocs网站。注意WebDriverWait对象的创建(第1行(,以及它在第一个Result赋值(第4行(中的使用

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
driver.Navigate().GoToUrl("https://www.google.com/ncr");
driver.FindElement(By.Name("q")).SendKeys("cheese" + Keys.Enter);
IWebElement firstResult = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("h3>div")));
Console.WriteLine(firstResult.GetAttribute("textContent"));

如果这确实是问题所在,您可能需要了解使用ExpectedConditions的各种方法。我从这里开始:Selenium文档:WebDriver等待

相关内容

  • 没有找到相关文章

最新更新